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.