Что означает эта строка кода?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
?
и :
смутите меня.
Это тернарный оператор C (Objective-C является надмножеством C):
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
семантически эквивалентен
if(inPseudoEditMode) {
label.frame = kLabelIndentedRect;
} else {
label.frame = kLabelRect;
}
Тернар без первого элемента (например, variable?: AnotherVariable
) означает то же, что и (valOrVar! = 0)? valOrVar: другойValOrVar
Это просто обычный тернарный оператор . Если часть перед вопросительным знаком истинна, она оценивает и возвращает часть перед двоеточием, в противном случае она оценивает и возвращает часть после двоеточия.
a?b:c
похоже на
if(a)
b;
else
c;
Это часть C, поэтому она не зависит от Objective-C. Вот перевод оператора if
:
if (inPseudoEditMode)
label.frame = kLabelIndentedRec;
else
label.frame = kLabelRect;
Это просто краткая форма написания оператора if-then-else. Это означает то же самое, что и следующий код:
if(inPseudoEditMode)
label.frame = kLabelIndentedRect;
else
label.frame = kLabelRect;
Это тернарный или условный оператор. Его основная форма:
condition ? valueIfTrue : valueIfFalse
Где значения будут оцениваться, только если они выбраны.
Основываясь на превосходном объяснении Барри Уорка ...
Что так важно в тернарном операторе, так это то, что его можно использовать в местах, где оператор if- иначе не может. т.е. внутри параметра условия или метода.
[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!