Cosa significano il punto interrogativo e i due punti (?: Operatore ternario) in obiettivo-c?


270

Cosa significa questa riga di codice?

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

L' ?e :mi confondono.


1
È l' operatore se-allora-altro ternario
Klaus Byskov Pedersen,

3
Si noti che questo dovrebbe essere un punto interrogativo, non virgolette.
Clahey,

6
Anche il compilatore sembra consentire variable ?: anotherVariable, cosa significa? '
Tony,

15
Il ternario senza primo elemento significa lo stesso di(valOrVar != 0) ? valOrVar : anotherValorvar
Scott Lahteine,

Risposte:


430

Questo è l' operatore ternario C (Objective-C è un superset di C):

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

è semanticamente equivalente a

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

Il ternario senza primo elemento (ad es. variable ?: anotherVariable) Significa lo stesso di(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(aggiornamento: Che schifo! Ripubblicare come risposta.) Ciò che è così importante per l'operatore ternario è che può essere usato in posti che un if-else non può. ovvero: all'interno di una condizione o di un parametro di metodo. [NSString stringWithFormat: @ "Status:% @", (statusBool? @ "Approved": @ "Rejected")] ... che è di grande utilità per le costanti del preprocessore: #define statusString (statusBool? @ "Approved": @ "Rifiutato") ... quindi: [NSString stringWithFormat: @ "Status:% @", statusString] Questo ti evita di dover usare e rilasciare variabili locali in schemi if-else. FTW!
Bruno Bronosky,

42
Vale probabilmente la pena ricordare che l'operatore ternario senza il primo elemento ( ?:) è ancora migliore nelle situazioni in cui il lato sinistro è un'espressione, in quanto ?:impedisce che venga valutato più di una volta. Ad esempio: [myArray firstObject] ? [myArray firstObject] : @"Hello World";chiama firstObjectdue volte (se firstObjectnon restituisce nil), dove [myArray firstObject] ?: @"Hello World";produce lo stesso risultato ma non chiama mai firstObjectpiù di una volta.
nhgrif,

finalmente ~~~~~ Uso questo operatore da anni (defo il mio preferito) ma non ho mai saputo come si chiama. la grande domanda ha ora una risposta. Grazie
Thang Do

Voglio anche aggiungere che l'operatore ternario senza il primo elemento ?:è anche chiamato operatore Elvis a causa della somiglianza delle emoji con il cantante. E ovviamente in questo caso, poiché stiamo lasciando cadere un elemento, non è più un operatore ternario ma un operatore binario . Gli operatori binari sono la stragrande maggioranza degli operatori che di solito usiamo durante la programmazione ( *, +, -, ^, |, ||, &, >>, ecc).
tomacco,

179

È l'operatore ternario o condizionale. La sua forma base è:

condition ? valueIfTrue : valueIfFalse

Dove i valori saranno valutati solo se vengono scelti.


8
Giusto per chiarire, non si limita ai valori. condition ? codeIfTrue : codeIfFalse
Mike S,

46

Semplicemente, la logica sarebbe

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


4
Questa è in realtà la risposta migliore perché le altre risposte implicano che puoi avere solo un "valore" come risultato, mentre ciò dimostra che puoi inserire qualsiasi codice arbitrario come risultato.
Mike S,

36

Basandoci sull'eccellente spiegazione di Barry Wark ...

Ciò che è così importante per l'operatore ternario è che può essere usato in luoghi che un if-else non può. ovvero: all'interno di una condizione o di un parametro di metodo.

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

... che è di grande utilità per le costanti del preprocessore:

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

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

Questo ti evita di dover usare e rilasciare variabili locali in schemi if-else. FTW!


14

Questo è solo il solito operatore ternario . Se la parte prima del punto interrogativo è vera, valuta e restituisce la parte prima dei due punti, altrimenti valuta e restituisce la parte dopo i due punti.

a?b:c

è come

if(a)
    b;
else
    c;

4

Questo fa parte di C, quindi non è specifico di Objective-C. Ecco una traduzione in una ifdichiarazione:

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

4

È solo una breve forma di scrittura di un'istruzione if-then-else. Significa lo stesso del seguente codice:

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

2

Esempio di operatore ternario. Se il valore della variabile booleana isFemale è SÌ, stampa "GENDER IS FEMALE", altrimenti "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.

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

2

Curiosità, in goal-c se si desidera controllare null / nil Ad esempio:

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

Il modo rapido per farlo è:

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

Quindi puoi aggiornarlo nel modo più semplice:

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

Perché in Objective-C:

  1. se un oggetto è nullo, restituirà false come booleano;
  2. Il secondo parametro dell'operatore ternario può essere vuoto, poiché restituirà il risultato a sinistra di '?'

Quindi diciamo che scrivi:

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

il secondo parametro restituisce un valore booleano, quindi viene generata un'eccezione.


1

È un operatore ternario, come un'istruzione if / else.

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

Nell'operatore ternario è così: condizione? cosa fare se la condizione è vera: cosa fare se è falsa;

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

2
Mi rendo conto che stai tentando di contribuire al sito, ma pubblicare risposte che semplicemente ripetono ciò che altre risposte hanno già dichiarato è generalmente scoraggiato, in quanto ingombra solo domande.
Chris Hayes,

1

Ho appena imparato qualcosa di nuovo sull'operatore ternario. La forma abbreviata che omette l'operando di mezzo è veramente elegante ed è una delle molte ragioni per cui C rimane rilevante. Cordiali saluti, per prima cosa ho davvero pensato a tutto ciò nel contesto di una routine implementata in C #, che supporta anche l'operatore ternario. Poiché l'operatore ternario è in C, è logico che sarebbe in altre lingue che ne sono essenzialmente estensioni (ad esempio, Objective-C, C #).


1

Come tutti hanno affermato, è un modo per rappresentare l'operatore condizionale

if (condition){ 
    true 
} 
else {
    false
}

utilizzo dell'operatore ternario (condition)? true:false Per aggiungere ulteriori informazioni, In breve abbiamo un nuovo modo di rappresentarlo utilizzando ??.

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

Che è simile a

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

è equivalente a

if (a>c)?a:c ==> È uguale a if (a>c)?:c

invece di ?:noi possiamo usare ??è veloce.


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

si intende

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.