¿Qué significa esta línea de código?¿Qué significa el signo de interrogación y el signo de dos puntos (?: Operador ternario) en objetivo-c?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
El ?
y :
me confunden.
¿Qué significa esta línea de código?¿Qué significa el signo de interrogación y el signo de dos puntos (?: Operador ternario) en objetivo-c?
label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
El ?
y :
me confunden.
Este es el C ternary operator (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 con ningún primer elemento (por ejemplo variable ?: anotherVariable
) significa la igual que (valOrVar != 0) ? valOrVar : anotherValOrVar
(actualización: ¡Repositorio como respuesta!) Lo que es tan importante acerca del operador ternario es que se puede usar en lugares que un if-else no puede. es decir: dentro de una condición o parámetro de método. [NSString stringWithFormat: @ "Estado:% @", (? StatusBool @ "Aprobado": @ "Rechazado")] ... lo cual es una gran utilidad para las constantes del preprocesador: #define statusString (statusBool? @ "Aprobado": @ "Rechazado") ... entonces: [NSString stringWithFormat: @ "Estado:% @", statusString] Esto le evita tener que utilizar y liberar las variables locales en if-else patrones. ¡FTW! –
¡Y es tan N E A T! – Morkrom
Probablemente valga la pena mencionar que el operador ternario sin el primer elemento ('?:') Es * aún mejor * en situaciones en las que el lado izquierdo es una expresión, ya que '?:' Impide que se evalúe más de una vez. Por ejemplo: '[myArray firstObject]? [myArray firstObject]: @ "Hello World"; 'llama a' firstObject' dos veces (si 'firstObject' no devuelve' nil'), donde '[myArray firstObject]?: @ "Hello World"; 'produce el mismo resultado pero nunca llama a' firstObject' más de una vez. – nhgrif
Esto es parte de C, por lo que no es específico de Objective-C. Aquí está una traducción en una declaración if
:
if (inPseudoEditMode)
label.frame = kLabelIndentedRec;
else
label.frame = kLabelRect;
Es sólo una forma abreviada de escribir una sentencia if-then-else. Significa lo mismo que el siguiente código:
if(inPseudoEditMode)
label.frame = kLabelIndentedRect;
else
label.frame = kLabelRect;
Es el operador ternario o condicional. Su forma básica es:
condition ? valueIfTrue : valueIfFalse
Donde los valores solo se evaluarán si se eligen.
Esto debería haber sido votado más, de manera simple y clara. – Celeritas
Solo para aclarar, no está limitado a valores. 'condición? codeIfTrue: codeIfFalse' –
Eso es lo de siempre ternary operator. Si la parte anterior al signo de interrogación es verdadera, evalúa y devuelve la parte antes del punto, de lo contrario, evalúa y devuelve la parte después del punto.
a?b:c
es como
if(a)
b;
else
c;
Sobre la excelente explicación de Barry Wark ...
¿Qué es tan importante sobre el operador ternario es que puede ser utilizado en lugares que un if-else no poder. es decir: dentro de una condición o parámetro de método.
[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]
... lo cual es una gran utilidad para las constantes del preprocesador:
// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")
// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]
Esto le evita tener que utilizar y liberar las variables locales en los patrones si-si no. ¡FTW!
Es un operador ternario, como una instrucció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;
. Agradezco que intente contribuir con el sitio, pero publicar respuestas que simplemente repiten lo que ya han declarado otras respuestas es generalmente desaconsejable, ya que solo complica las preguntas. –
int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;
significa
int padding;
if ([[UIScreen mainScreen] bounds].size.height <= 480)
padding = 15;
else
padding = 55;
Simplemente, la lógica sería
(condition) ? (code for YES) : (code for NO)
simple y elegante – Barracuda
Esta es en realidad la ** mejor ** respuesta porque las otras respuestas implican que solo puede tener un "valor" como resultado, mientras que esto muestra que puede poner cualquier código arbitrario como resultado. –
simplemente he aprendido algo nuevo sobre el operador ternario. La forma corta que omite el operando medio es realmente elegante, y es una de las muchas razones por las que C sigue siendo relevante. Para su información, primero entendí esto en el contexto de una rutina implementada en C#, que también es compatible con el operador ternario. Como el operador ternario está en C, es lógico pensar que sería en otros lenguajes que son esencialmente extensiones de los mismos (por ejemplo, Objective-C, C#).
Como todo el mundo que se hace referencia, es una forma de representar operador condicional
if (condition){
true
}
else {
false
}
utilizando operador ternario (condition)? true:false
Para añadir información adicional, en Swift tenemos nueva forma de representarla por medio de ??
.
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 ?:
podemos usar ??
es rápida.
Ejemplo de operador ternario.Si el valor de isFemale variable booleana es SÍ, imprimir "género es femenina" de otro modo "el 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.
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.
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 Objective-C si desea comprobar nulo/nulo Por ejemplo:
-(NSString*) getSomeStringSafeCheck
{
NSString *string = [self getSomeString];
if(string != nil){
return String;
}
return @"";
}
La forma más rápida de hacerlo es:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString] != nil ? [self getSomeString] : @"";
}
Entonces se puede actualizar a una forma más sencilla:
-(NSString*) getSomeStringSafeCheck
{
return [self getSomeString]?: @"";
}
Porque en Objective-C:
así que vamos a decir que usted escribe:
[self getSomeString] != nil?: @"";
el segundo parámetro devuelve un valor booleano, por tanto, se produce una excepción.
Tenga en cuenta que esto debería ser un signo de interrogación, no de comillas. – clahey
oops, lo siento, tienes razón. – rdesign
El compilador también parece permitir 'variable?: AnotherVariable', ¿qué significa esto? ' – Tony