Что означает знак вопроса и двоеточие (?: Троичный оператор) в target-c?

270

Что означает эта строка кода?

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

?И :запутать меня.

danielreiser
источник
1
Это троичный оператор if-then-else
Клаус Бысков Педерсен
3
Обратите внимание, что это должен быть знак вопроса, а не кавычка.
Клэй
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
(обновление: Тьфу! Повторная публикация в качестве ответа.) Что важно в тернарном операторе, так это то, что он может использоваться в местах, которые не может использовать if-else. т.е.: внутри условия или параметра метода. [NSString stringWithFormat: @ "Status:% @", (statusBool? @ "Approved": @ "Rejected")] ... ... который отлично подходит для констант препроцессора: #define statusString (statusBool? @ "Approved": @ «Отклонено») ... then: [NSString stringWithFormat: @ «Status:% @», statusString] Это избавляет вас от необходимости использовать и освобождать локальные переменные в шаблонах if-else. FTW!
Бруно Броноски
42
Вероятно, стоит упомянуть, что троичный оператор без первого элемента ( ?:) даже лучше в ситуациях, когда левая часть является выражением, поскольку ?:предотвращает его оценку более одного раза. Например: [myArray firstObject] ? [myArray firstObject] : @"Hello World";вызывает firstObjectдважды (если firstObjectне возвращает nil), где [myArray firstObject] ?: @"Hello World";выдает одинаковый результат, но никогда не вызывает firstObjectбольше одного раза.
nhgrif
наконец ~~~~~ Я использовал этот оператор целую вечность (дефо мой любимый), но никогда не знал, как он называется. на большой вопрос теперь ответили. Спасибо
Танг До
Также хочу добавить, что троичный оператор без первого элемента ?:также называется оператором Элвиса из-за сходства смайликов с певцом. И, конечно, в этом случае, когда мы отбрасываем один элемент, это уже не троичный оператор, а бинарный оператор . Бинарные операторы включают в себя подавляющее большинство операторов мы обычно используем при программировании ( *, +, -, ^, |, ||, &, >>и т.д.).
Томакко
179

Это троичный или условный оператор. Это основная форма:

condition ? valueIfTrue : valueIfFalse

Где значения будут оцениваться, только если они выбраны.

Шон
источник
8
Просто чтобы уточнить, это не ограничивается ценностями. condition ? codeIfTrue : codeIfFalse
Майк С
46

Просто логика будет

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

Варун Гоял
источник
4
На самом деле это лучший ответ, потому что другие ответы подразумевают, что в результате вы можете иметь только «значение», тогда как это показывает, что вы можете поместить любой произвольный код в качестве результата.
Майк С,
36

Опираясь на отличное объяснение Барри Уорка ...

В тернарном операторе так важно то, что его можно использовать там, где не может 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!

оборота Ричард Броноски
источник
14

Это просто обычный троичный оператор . Если часть перед знаком вопроса имеет значение true, она оценивает и возвращает деталь перед двоеточием, в противном случае она оценивает и возвращает деталь после двоеточия.

a?b:c

как

if(a)
    b;
else
    c;
Брайан
источник
4

Это часть C, поэтому она не специфична для Objective-C. Вот перевод в ifзаявление:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;
Дитрих Эпп
источник
4

Это просто короткая форма написания оператора if-then-else. Это означает то же, что и следующий код:

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;
Клаус Брош
источник
2

Пример троичного оператора. Если значение логической переменной 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.
handiansom
источник
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. если объект имеет значение nil, он вернет false как логическое значение;
  2. Второй параметр троичного оператора может быть пустым, так как он вернет результат слева от '?'

Так скажем, вы пишете:

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

второй параметр возвращает логическое значение, поэтому генерируется исключение.

BananZ
источник
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;
cdhw
источник
2
Я ценю то, что вы пытаетесь внести свой вклад в сайт, но публикация ответов, которые просто повторяют то, что уже было сказано в других ответах, обычно не рекомендуется, так как это просто загромождает вопросы.
Крис Хейс
1

Я только что узнал что-то новое о троичном операторе. Краткая форма, в которой опускается средний операнд, действительно элегантна и является одной из многих причин, по которой С остается актуальным. К вашему сведению, я впервые обдумал это в контексте подпрограммы, реализованной в 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; 
Abo3atef
источник