Cosa significa questa riga di codice?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
L' ?
e :
mi confondono.
variable ?: anotherVariable
, cosa significa? '
(valOrVar != 0) ? valOrVar : anotherValorvar
Cosa significa questa riga di codice?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
L' ?
e :
mi confondono.
variable ?: anotherVariable
, cosa significa? '
(valOrVar != 0) ? valOrVar : anotherValorvar
Risposte:
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
?:
) è 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 firstObject
due volte (se firstObject
non restituisce nil
), dove [myArray firstObject] ?: @"Hello World";
produce lo stesso risultato ma non chiama mai firstObject
più di una volta.
?:
è 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).
Semplicemente, la logica sarebbe
(condition) ? {code for YES} : {code for NO}
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!
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;
Questo fa parte di C, quindi non è specifico di Objective-C. Ecco una traduzione in una if
dichiarazione:
if (inPseudoEditMode)
label.frame = kLabelIndentedRec;
else
label.frame = kLabelRect;
È 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;
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.
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:
Quindi diciamo che scrivi:
[self getSomeString] != nil?: @"";
il secondo parametro restituisce un valore booleano, quindi viene generata un'eccezione.
È 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;
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 #).
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.