Що означає знак запитання та двокрапка (?: Потрійний оператор) в цілі-c?


270

Що означає цей рядок коду?

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

?І :запитати мене.


1
Це потрійний оператор, якщо тоді
Клаус Бисков Педерсен,

3
Зверніть увагу, що це повинен бути знак питання, а не лапок.
clahey

6
Здається, компілятор дозволяє variable ?: anotherVariable, що це означає? '
Тоні

15
(valOrVar != 0) ? valOrVar : anotherValorvar
Трійця

Відповіді:


430

Це потрійний оператор C (Objective-C - це супернабір C):

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

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

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

Потрійник без першого елемента (наприклад variable ?: anotherVariable) означає те саме, що(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(оновлення: Юк! Повторне повідомлення як відповідь.) Що таке важливе значення для потрійного оператора, це те, що він може бути використаний у місцях, які інший не може. тобто: Всередині параметра або методу. [NSString stringWithFormat: @ "Статус:% @", (statusBool? @ "Затверджено": @ "Відхилено")] ... ... що чудово використовує константи попереднього процесу: #define statusString (statusBool? @ "Затверджено": @ "Відхилено") ... тоді: [NSString stringWithFormat: @ "Статус:% @", statusString] Це позбавить вас від необхідності використання та випуску локальних змінних у шаблонах if-else. FTW!
Бруно Броноський

42
Напевно, варто згадати, що потрійний оператор без першого елемента ( ?:) ще кращий у ситуаціях, коли ліва сторона є виразом, оскільки ?:заважає оцінювати його не один раз. Наприклад: [myArray firstObject] ? [myArray firstObject] : @"Hello World";дзвони firstObjectдвічі (якщо firstObjectне повертається nil), де [myArray firstObject] ?: @"Hello World";дає однаковий результат, але ніколи не дзвонить firstObjectбільше одного разу.
nhgrif

нарешті ~~~~~ Я використовував цей оператор протягом століть (дефото мій улюблений), але ніколи не знав, як це називається. зараз велике запитання відповіли. Спасибі
Thang Do

Також хочемо додати, що потрійний оператор без першого елемента ?:також називається оператором Елвіса через схожість емоджи на співака. І звичайно, у цьому випадку, коли ми скидаємо один елемент, це вже не потрійний оператор, а двійковий оператор . Бінарні оператори включають в себе переважна більшість операторів ми зазвичай використовуємо при програмуванні ( *, +, -, ^, |, ||, &, >>і т.д.).
tomacco

179

Це потрійний або умовний оператор. Основна форма:

condition ? valueIfTrue : valueIfFalse

Де значення оцінюватимуться лише за умови їх вибору.


8
Просто для уточнення, це не обмежується значеннями. condition ? codeIfTrue : codeIfFalse
Майк S

46

Просто логіка була б

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


4
Це насправді найкраща відповідь, оскільки з інших відповідей випливає, що у результаті ви можете мати лише "значення", тоді як це показує, що ви можете поставити будь-який довільний код як результат.
Майк S

36

Спираючись на чудове пояснення Баррі Варка ...

Що є важливим у потрійному операторі, це те, що він може бути використаний у місцях, де інший не може. тобто: Всередині параметра або методу.

[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!


14

Це просто звичайний потрійний оператор . Якщо частина перед знаком питання відповідає істині, вона оцінює та повертає частину перед двокрапкою, інакше вона оцінює та повертає частину після двокрапки.

a?b:c

це як

if(a)
    b;
else
    c;

4

Це частина C, тому це не є специфічним для Objective-C. Ось переклад ifзаяви:

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

4

Це лише коротка форма написання твердження про те, що інше. Це означає те саме, що і наступний код:

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

2

Приклад термінального оператора. Якщо значення 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.

2

Приємний факт, що в 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:

  1. якщо об’єкт є нульовим, він поверне помилковим як булевий;
  2. Другий параметр термінального оператора може бути порожнім, оскільки він поверне результат зліва від "?"

Тож скажіть, що ви пишете:

[self getSomeString] != nil?: @"";

другий параметр повертає булеве значення, тому викидається виняток.


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
Я вдячний, що ви намагаєтесь зробити свій внесок на сайт, але публікація відповідей, які просто повторюють те, що вже були сказані інші відповіді, як правило, не рекомендується, оскільки це просто захаращує питання.
Кріс Хейс

1

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


1

Як згадували всі, це спосіб представлення умовного оператора

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

замість того, що ?:ми можемо використовувати, ??це швидко.


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; 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.