Що означає цей рядок коду?
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}
Спираючись на чудове пояснення Баррі Варка ...
Що є важливим у потрійному операторі, це те, що він може бути використаний у місцях, де інший не може. тобто: Всередині параметра або методу.
[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!
Це просто звичайний потрійний оператор . Якщо частина перед знаком питання відповідає істині, вона оцінює та повертає частину перед двокрапкою, інакше вона оцінює та повертає частину після двокрапки.
a?b:c
це як
if(a)
b;
else
c;
Це частина C, тому це не є специфічним для Objective-C. Ось переклад if
заяви:
if (inPseudoEditMode)
label.frame = kLabelIndentedRec;
else
label.frame = kLabelRect;
Це лише коротка форма написання твердження про те, що інше. Це означає те саме, що і наступний код:
if(inPseudoEditMode)
label.frame = kLabelIndentedRect;
else
label.frame = kLabelRect;
Приклад термінального оператора. Якщо значення isFeni boole змінна значення ТА, надрукуйте "GENDER IS FEMALE", інакше "GENDER MALE"
? means = execute the codes before the : if the condition is true.
: means = execute the codes after the : if the condition is false.
Ціль-С
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 залишається актуальною. FYI, я вперше дійсно обернувся цим питанням у контексті розпорядку, реалізованого в 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
замість того, що ?:
ми можемо використовувати, ??
це швидко.