Что означает знак вопроса и двоеточие (?: Троичный оператор) в 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.