Что означает знак вопроса и двоеточие (?: Троичный оператор) в target-c? - PullRequest
259 голосов
/ 07 апреля 2010

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

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

? и : смущают меня.

Ответы [ 13 ]

420 голосов
/ 07 апреля 2010

Это троичный оператор C (Objective-C - это расширенный набор C):

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

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

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

Тернар без первого элемента (например, variable ?: anotherVariable) означает то же самое, что и (valOrVar != 0) ? valOrVar : anotherValOrVar

175 голосов
/ 07 апреля 2010

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

condition ? valueIfTrue : valueIfFalse

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

41 голосов
/ 20 февраля 2014

Проще говоря, логика будет

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

36 голосов
/ 06 мая 2010

Опираясь на превосходное объяснение Барри Уорка ...

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

13 голосов
/ 07 апреля 2010

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

a?b:c

похоже на

if(a)
    b;
else
    c;
4 голосов
/ 07 апреля 2010

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

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;
4 голосов
/ 07 апреля 2010

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

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;
2 голосов
/ 26 января 2018

Интересный факт, в target-c, если вы хотите проверить ноль / ноль Например:

-(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. Второй параметр Ternary Operator может быть пустым, так как он вернет результат слева от '?'

Итак, допустим, вы пишете:

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

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

2 голосов
/ 21 марта 2017

Пример троичного оператора. Если значение 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.
1 голос
/ 23 марта 2016

Как все уже говорили, это способ представления условного оператора

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

вместо ?: мы можем использовать ?? быстро.

...