2010-04-07 11 views

Odpowiedz

375

Jest C ternary operator (cel-C jest rozszerzeniem C):

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

jest semantycznie równoważne

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

trójskładnikowego bez pierwszego elementu (np variable ?: anotherVariable) oznacza to samo co (valOrVar != 0) ? valOrVar : anotherValOrVar

+25

(aktualizacja: Yuck! Repostowanie jako odpowiedź.) To, co jest tak ważne w przypadku operatora trójargumentowego, to fakt, że może on być używany w miejscach, do których nie ma dostępu. tj .: Wewnątrz warunku lub parametru metody. [NSString stringWithFormat: @ "Status:% @" (? StatusBool @ "Approved": @ "Odrzucony")] ... co jest bardzo przydatne dla stałych preprocesora: #define statusString (statusBool? @ "Approved": @ "Odrzucony") ... następnie: [NSString stringWithFormat: @ "status:% @", statusString] To pozwala uniknąć konieczności korzystania i zwolnić zmiennych lokalnych w if-else wzorce. FTW! –

+3

I tak to N A A T! – Morkrom

+41

Warto wspomnieć, że operator potrójny bez pierwszego elementu ('?:') Jest * jeszcze lepszy * w sytuacjach, w których lewa strona jest wyrażeniem, ponieważ '?:' Uniemożliwia jej ocenę więcej niż jeden raz. Na przykład: '[myArray firstObject]? [myArray firstObject]: @ "Hello World"; 'wywołuje' firstObject' dwa razy (jeśli 'firstObject' nie zwraca' nil'), gdzie '[myArray firstObject]?: @ "Hello World"; 'daje identyczny wynik, ale nigdy nie wywołuje' firstObject' więcej niż raz. – nhgrif

4

Jest to część C, więc nie jest specyficzna dla Celu-C. Oto tłumaczenie do instrukcji if:

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

To tylko krótka forma pisania if-then-else. Oznacza to taki sam kod jak:

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

Jest to operator trójskładnikowy lub warunkowy. Jego podstawową formą jest:

condition ? valueIfTrue : valueIfFalse 

Gdzie wartości będą oceniane tylko wtedy, gdy zostaną wybrane.

+25

To powinno było zostać poddane pod głosowanie bardziej, tak proste i jasne. – Celeritas

+7

Aby wyjaśnić, nie ogranicza się do wartości. 'warunek? codeIfTrue: codeIfFalse' –

13

To tylko zwykły ternary operator. Jeśli część przed znakiem zapytania jest prawdziwa, ocenia i zwraca część przed dwukropkiem, w przeciwnym razie ocenia i zwraca część za dwukropkiem.

a?b:c 

jest jak

if(a) 
    b; 
else 
    c; 
34

Opierając się na Barry'ego WARK wspaniałe wyjaśnienie ...

Co jest tak ważne, o operatora potrójnego jest to, że może on być stosowany w miejscach, które if-else nie może. tj .: Wewnątrz warunku lub parametru metody.

[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")] 

... co jest bardzo przydatne dla stałych preprocesora:

// in your pch file... 
#define statusString (statusBool ? @"Approved" : @"Rejected") 

// in your m file... 
[NSString stringWithFormat: @"Status: %@", statusString] 

To pozwala uniknąć konieczności korzystania i zwolnić zmiennych lokalnych w if-else wzorów. FTW!

1

Jest to operator potrójny, podobnie jak instrukcja if/else.

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

W potrójnym operatorze jest tak: warunek: ?co zrobić, jeśli warunek jest prawdziwy: co zrobić, jeśli jest fałszywe;

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

Doceniam fakt, że próbujesz przyczynić się do powstania witryny, ale publikujesz odpowiedzi, które po prostu powtarzają to, co inne odpowiedzi już wyraziły, ogólnie rzecz biorąc, odradza się, ponieważ po prostu zaśmiecają pytania. –

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

oznacza

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

Wystarczy, logika byłaby

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

+3

Prosta i elegancka – Barracuda

+3

Jest to w rzeczywistości ** najlepsza ** odpowiedź, ponieważ inne odpowiedzi sugerują, że w rezultacie można uzyskać tylko "wartość", podczas gdy pokazuje to, że można w rezultacie umieścić dowolny kod. –

1

Właśnie dowiedziałem się czegoś nowego o operatora potrójnego. Krótka forma, która pomija środkowy operand, jest naprawdę elegancka i jest jednym z wielu powodów, dla których C jest istotne. FYI, po raz pierwszy naprawdę poradził sobie z tym w kontekście rutyny zaimplementowanej w języku C#, która również obsługuje operatora trójskładnikowego. Ponieważ operator trójskładnikowy znajduje się w C, jest oczywiste, że byłby on w innych językach, które są w zasadzie jego rozszerzeniami (np., Objective-C, C#).

1

Jak każdy, o którym mowa, że ​​to jest sposób reprezentacji operator warunkowy

if (condition){ 
    true 
} 
else { 
    false 
} 

używając potrójny operator (condition)? true:false Aby dodać dodatkowe informacje, w Swift mamy nowy sposób reprezentowania go przy ??.

let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString 

który jest podobny do

int a = 6, c= 5; 
if (a > c) 
{ 
a is greater 
} else { 
c is greater 
} 

jest równoważna

if (a>c)?a:c ==> Czy równa if (a>c)?:c

zamiast ?: możemy wykorzystać ?? jest szybki.

0

Przykład operatora trójskładnikowego.Jeżeli wartość isFemale zmiennej logicznej brzmi TAK, druk "gender jest kobietą" inaczej "płeć jest 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. 

Dla 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. 
0

Ciekawostka, w Objective-C, jeśli chcesz sprawdzić/null nil Na przykład:

-(NSString*) getSomeStringSafeCheck 
{ 
    NSString *string = [self getSomeString]; 
    if(string != nil){ 
     return String; 
    } 
    return @""; 
} 

szybki sposób, aby to zrobić jest:

-(NSString*) getSomeStringSafeCheck 
{ 
    return [self getSomeString] != nil ? [self getSomeString] : @""; 
} 

Następnie można zaktualizować że w najprostszy sposób:

-(NSString*) getSomeStringSafeCheck 
{ 
    return [self getSomeString]?: @""; 
} 

Ponieważ w celu C:

  1. jeśli obiekt jest zerowy, zwróci false jako boolean;
  2. Drugi parametr operatora potrójnego może być pusty, ponieważ zwróci wynik po lewej stronie symbolu "?"

Więc powiedzmy piszesz:

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

drugi parametr zwraca wartość logiczną, zatem wyjątku.