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


270

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

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

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


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.

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?: @"";

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


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 #, которая также поддерживает троичный оператор. Поскольку троичный оператор находится в 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.