Что означает эта строка кода?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
?
И :
запутать меня.
variable ?: anotherVariable
, что это значит?
(valOrVar != 0) ? valOrVar : anotherValorvar
Что означает эта строка кода?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
?
И :
запутать меня.
variable ?: anotherVariable
, что это значит?
(valOrVar != 0) ? valOrVar : anotherValorvar
Ответы:
Это троичный оператор C (Objective-C является надмножеством C):
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
семантически эквивалентно
if(inPseudoEditMode) {
label.frame = kLabelIndentedRect;
} else {
label.frame = kLabelRect;
}
Тройной без первого элемента (например variable ?: anotherVariable
) означает то же самое, что(valOrVar != 0) ? valOrVar : anotherValOrVar
?:
) даже лучше в ситуациях, когда левая часть является выражением, поскольку ?:
предотвращает его оценку более одного раза. Например: [myArray firstObject] ? [myArray firstObject] : @"Hello World";
вызывает firstObject
дважды (если firstObject
не возвращает nil
), где [myArray firstObject] ?: @"Hello World";
выдает одинаковый результат, но никогда не вызывает firstObject
больше одного раза.
?:
также называется оператором Элвиса из-за сходства смайликов с певцом. И, конечно, в этом случае, когда мы отбрасываем один элемент, это уже не троичный оператор, а бинарный оператор . Бинарные операторы включают в себя подавляющее большинство операторов мы обычно используем при программировании ( *
, +
, -
, ^
, |
, ||
, &
, >>
и т.д.).
Просто логика будет
(condition) ? {code for YES} : {code for NO}
Опираясь на отличное объяснение Барри Уорка ...
В тернарном операторе так важно то, что его можно использовать там, где не может 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!
Это просто обычный троичный оператор . Если часть перед знаком вопроса имеет значение true, она оценивает и возвращает деталь перед двоеточием, в противном случае она оценивает и возвращает деталь после двоеточия.
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;
Пример троичного оператора. Если значение логической переменной isFemale равно YES, выведите «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.
Для Свифта
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.
Забавный факт, в target-c, если вы хотите проверить null / nil Например:
-(NSString*) getSomeStringSafeCheck
{
NSString *string = [self getSomeString];
if(string != nil){
return String;
}
return @"";
}
Быстрый способ сделать это:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString] != nil ? [self getSomeString] : @"";
}
Тогда вы можете обновить его до простого способа:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString]?: @"";
}
Потому что в Objective-C:
Так скажем, вы пишете:
[self getSomeString] != nil?: @"";
второй параметр возвращает логическое значение, поэтому генерируется исключение.
Это троичный оператор, как оператор if / else.
if(a > b) {
what to do;
}
else {
what to do;
}
В троичном операторе это так: условие? что делать, если условие истинно; что делать, если оно ложно;
(a > b) ? what to do if true : what to do if false;
Я только что узнал что-то новое о троичном операторе. Краткая форма, в которой опускается средний операнд, действительно элегантна и является одной из многих причин, по которой С остается актуальным. К вашему сведению, я впервые обдумал это в контексте подпрограммы, реализованной в C #, которая также поддерживает троичный оператор. Поскольку троичный оператор находится в C, очевидно, что он будет в других языках, которые по существу являются его расширениями (например, Objective-C, C #).
Как все говорили, это способ представления условного оператора
if (condition){
true
}
else {
false
}
Использование тернарного оператора (condition)? true:false
Чтобы добавить дополнительную информацию, в Swift у нас есть новый способ ее представления, используя ??
.
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
вместо того, чтобы ?:
мы могли использовать ??
это быстро.