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

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

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

на ? и : путай меня.

13 ответов


Это C тернарный оператор (Objective-C является надмножеством C):

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

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

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

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


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

condition ? valueIfTrue : valueIfFalse

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


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

что так важно в тернарном операторе, так это то, что его можно использовать там, где if-else не может. ie: внутри условия или параметра метода.

[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!


просто, логика была бы

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


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

a?b:c

как

if(a)
    b;
else
    c;

это часть C, поэтому она не является объективной-c конкретной. Вот перевод на if о себе:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;

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

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

Это тернарный оператор, как оператор if/else оператор.

if(a > b) {
what to do;
}
else {
what to do;
}

в тернарном операторе это так: состояние ? что делать, если условие истинно : что делать, если оно ложно;

(a > b) ? what to do if true : what to do if false;

Я только что узнал кое-что новое о тернарном операторе. Короткая форма, которая опускает средний операнд, действительно элегантна и является одной из многих причин, по которым C остается актуальным. К вашему сведению, я впервые действительно понял это в контексте подпрограммы, реализованной на C#, которая также поддерживает тернарный оператор. Поскольку тернарный оператор находится в C, логично предположить, что он будет в других языках, которые по существу являются его расширениями (e. г., Objective-C, C#).


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

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

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


int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;

означает

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 

пример троичного оператора.Если значение isFemale булева переменная-да, печать "GENDER is FEMALE" в противном случае " GENDER IS Мужской"

? 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.

Для Swift

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.

забавный факт, в objective-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. если объект равен нулю, он вернет false как boolean;
  2. второй параметр тернарного оператора может быть пустым, так как он вернет результат слева от '?'

так позвольте сказать вам пиши:

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

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