¿Qué significa esta línea de código?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
El ?
y :
me confunden.
variable ?: anotherVariable
, ¿qué significa esto?
(valOrVar != 0) ? valOrVar : anotherValorvar
¿Qué significa esta línea de código?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
El ?
y :
me confunden.
variable ?: anotherVariable
, ¿qué significa esto?
(valOrVar != 0) ? valOrVar : anotherValorvar
Respuestas:
Este es el operador ternario C (Objective-C es un superconjunto de C):
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
es semánticamente equivalente a
if(inPseudoEditMode) {
label.frame = kLabelIndentedRect;
} else {
label.frame = kLabelRect;
}
El ternario sin primer elemento (p variable ?: anotherVariable
. Ej. ) Significa lo mismo que(valOrVar != 0) ? valOrVar : anotherValOrVar
?:
) es aún mejor en situaciones en las que el lado izquierdo es una expresión, ya que ?:
evita que se evalúe más de una vez. Por ejemplo: [myArray firstObject] ? [myArray firstObject] : @"Hello World";
llama firstObject
dos veces (si firstObject
no regresa nil
), donde [myArray firstObject] ?: @"Hello World";
produce el resultado idéntico pero nunca llama firstObject
más de una vez.
?:
también se llama operador Elvis debido a la semejanza emoji con el cantante. Y, por supuesto, en este caso, ya que estamos eliminando un elemento, ya no es un operador ternario sino un operador binario . Los operadores binarios incluyen la gran mayoría de los operadores que suelen utilizar al programar ( *
, +
, -
, ^
, |
, ||
, &
, >>
, etc).
Simplemente, la lógica sería
(condition) ? {code for YES} : {code for NO}
Sobre la base de la excelente explicación de Barry Wark ...
Lo que es tan importante sobre el operador ternario es que se puede usar en lugares que un if-else no puede. es decir: dentro de un parámetro de condición o método.
[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]
... que es un gran uso para las constantes del preprocesador:
// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")
// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]
Esto le ahorra tener que usar y liberar variables locales en patrones if-else. FTW!
Ese es solo el operador ternario habitual . Si la parte anterior al signo de interrogación es verdadera, evalúa y devuelve la parte anterior a los dos puntos; de lo contrario, evalúa y devuelve la parte posterior a los dos puntos.
a?b:c
es como
if(a)
b;
else
c;
Esto es parte de C, por lo que no es específico de Objective-C. Aquí hay una traducción en una if
declaración:
if (inPseudoEditMode)
label.frame = kLabelIndentedRec;
else
label.frame = kLabelRect;
Es solo una forma corta de escribir una declaración if-then-else. Significa lo mismo que el siguiente código:
if(inPseudoEditMode)
label.frame = kLabelIndentedRect;
else
label.frame = kLabelRect;
Ejemplo de operador ternario. Si el valor de la variable booleana isFemale es SÍ, imprima "GÉNERO ES HEMBRA", de lo contrario, "GÉNERO ES MASCULINO"
? means = execute the codes before the : if the condition is true.
: means = execute the codes after the : if the condition is false.
C objetivo
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.
Para 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.
Dato curioso, en el objetivo-c si desea marcar nulo / nulo Por ejemplo:
-(NSString*) getSomeStringSafeCheck
{
NSString *string = [self getSomeString];
if(string != nil){
return String;
}
return @"";
}
La forma rápida de hacerlo es:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString] != nil ? [self getSomeString] : @"";
}
Luego puede actualizarlo de la manera más simple:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString]?: @"";
}
Porque en Objective-C:
Así que digamos que escribes:
[self getSomeString] != nil?: @"";
el segundo parámetro devuelve un valor booleano, por lo tanto, se genera una excepción.
Es un operador ternario, como una declaración if / else.
if(a > b) {
what to do;
}
else {
what to do;
}
En operador ternario es así: ¿condición? qué hacer si la condición es verdadera: qué hacer si es falsa;
(a > b) ? what to do if true : what to do if false;
Acabo de aprender algo nuevo sobre el operador ternario. La forma corta que omite el operando del medio es verdaderamente elegante, y es una de las muchas razones por las que C sigue siendo relevante. Para su información, primero entendí realmente esto en el contexto de una rutina implementada en C #, que también es compatible con el operador ternario. Dado que el operador ternario está en C, es lógico pensar que estaría en otros lenguajes que son esencialmente extensiones del mismo (por ejemplo, Objective-C, C #).
Como todos lo mencionaron, es una forma de representar operador condicional
if (condition){
true
}
else {
false
}
usando el operador ternario (condition)? true:false
Para agregar información adicional, en swift tenemos una nueva forma de representarlo usando ??
.
let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString
Que es similar a
int a = 6, c= 5;
if (a > c)
{
a is greater
} else {
c is greater
}
es equivalente a
if (a>c)?a:c
==> es igual a if (a>c)?:c
en lugar de ?:
que podamos usar ??
es rápido.