Что означает знак вопроса и двоеточие (?: Троичный оператор) в target-c?

218

Что означает эта строка кода?

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

? и : путают меня.

  • 1
    Это троичный оператор if-then-else
  • 3
    Обратите внимание, что это должен быть знак вопроса, а не кавычка.
Показать ещё 3 комментария
Теги:
operators
syntax
conditional-operator

12 ответов

351
Лучший ответ

Это трёхмерный оператор <

> "noreferrer >

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

семантически эквивалентно

if(inPseudoEditMode) {
 label.frame = kLabelIndentedRect;
} else {
 label.frame = kLabelRect;
}

Тернар без первого элемента (например, variable ?: anotherVariable) означает то же самое, что и (valOrVar != 0) ? valOrVar : anotherValOrVar

  • 27
    (обновление: Тьфу! Повторная публикация в качестве ответа.) Что важно в троичном операторе, так это то, что он может использоваться в местах, которые не может использовать if-else. т.е.: внутри условия или параметра метода. [NSString stringWithFormat: @ "Status:% @", (statusBool? @ "Approved": @ "Rejected")] ... ... который отлично подходит для констант препроцессора: #define statusString (statusBool? @ "Approved": @ «Отклонено») ... then: [NSString stringWithFormat: @ «Status:% @», statusString] Это избавляет вас от необходимости использовать и освобождать локальные переменные в шаблонах if-else. FTW!
  • 3
    И это так аккуратно!
Показать ещё 3 комментария
155

Это тернарный или условный оператор. Это базовая форма:

condition ? valueIfTrue : valueIfFalse

Если значения будут оцениваться только в том случае, если они выбраны.

  • 25
    За это должно было проголосовать больше, так просто и понятно.
  • 7
    Просто чтобы уточнить, это не ограничивается ценностями. condition ? codeIfTrue : codeIfFalse
35

Строительство на Барри Wark отличное объяснение...

Что так важно в тройном операторе, так это то, что его можно использовать в тех местах, где if-else не может. т.е.: внутри параметра условия или метода.

[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]

..., что очень полезно для препроцессорных констант:

// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")

// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]

Это избавит вас от необходимости использовать и освобождать локальные переменные в шаблонах if-else. FTW!

28

Просто логика будет

(condition) ? (code for YES) : (code for NO)

  • 3
    простой и элегантный
  • 3
    На самом деле это лучший ответ, потому что другие ответы подразумевают, что в результате вы можете иметь только «значение», тогда как это показывает, что вы можете поместить любой произвольный код в качестве результата.
13

Это обычный обычный тернарный оператор. Если часть перед вопросительным знаком истинна, она оценивает и возвращает часть перед двоеточием, иначе она оценивает и возвращает часть после двоеточия.

a?b:c

похож на

if(a)
    b;
else
    c;
4

Это просто краткая форма написания оператора if-then-else. Это означает, что следующий код:

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;
4

Это часть C, поэтому она не имеет значения Objective-C. Здесь перевод в оператор if:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;
1

Как все говорили, что это способ представления условного оператора

if (condition){ 
    true 
} 
else {
    false
}

с использованием тернарного оператора (condition)? true:false Чтобы добавить дополнительную информацию, в Quickift у нас есть новый способ представления с помощью ??.

let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString

Что похоже на

int a = 6, c= 5;
if (a > c) 
{ 
 a is greater
} else {
 c is greater
}

эквивалентно

if (a>c)?a:c == > Является равным if (a>c)?:c

вместо ?: мы можем использовать ?? быстро.

1

Я только что узнал что-то новое о тернарном операторе. Короткая форма, которая опускает средний операнд, действительно элегантна и является одной из многих причин, по которым C остается актуальной. FYI, я вначале столкнулся с этим в контексте процедуры, реализованной на С#, которая также поддерживает тройной оператор. Поскольку тернарный оператор находится в C, то разумно, что он был бы на других языках, которые по существу являются его расширениями (например, Objective-C, С#).

1
int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;

означает

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
1

Это тернарный оператор, как оператор if/else.

if(a > b) {
what to do;
}
else {
what to do;
}

В тройном операторе это выглядит так: состояние? что делать, если условие истинно: что делать, если оно ложно;

(a > b) ? what to do if true : what to do if false;
  • 2
    Я ценю то, что вы пытаетесь внести свой вклад в сайт, но публикация ответов, которые просто повторяют то, что уже было сказано в других ответах, обычно не рекомендуется, так как это просто загромождает вопросы.
0

Пример троичного оператора. Если значение isFemale boolean variable - YES, print "GENDER is FEMALE" в противном случае "GENDER IS MALE"

? means = execute the codes before the : if the condition is true. 
: means = execute the codes after the : if the condition is false.

Objective-C

BOOL isFemale = YES;
NSString *valueToPrint = (isFemale == YES) ? @"GENDER IS FEMALE" : @"GENDER IS MALE";
NSLog(valueToPrint); //Result will be "GENDER IS FEMALE" because the value of isFemale was set to YES.

Для Swift

let isFemale = false
let valueToPrint:String = (isFemale == true) ? "GENDER IS FEMALE" : "GENDER IS MALE"
print(valueToPrint) //Result will be  "GENDER IS MALE" because the isFemale value was set to false.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню