Що означає знак запитання та двокрапка (?: Потрійний оператор) в цілі-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.