¿Qué significa el signo de interrogación y el signo de dos puntos (?: Operador ternario) en objective-c?

¿Qué significa esta línea de código?

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

El ? y : confundenme

Este es el operador ternario (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 (por ejemplo, variable ?: anotherVariable ) significa lo mismo que (valOrVar != 0) ? valOrVar : anotherValOrVar (valOrVar != 0) ? valOrVar : anotherValOrVar

Es el operador ternario o condicional. Su forma básica es:

 condition ? valueIfTrue : valueIfFalse 

Donde los valores solo serán evaluados si son elegidos.

Basándose en la excelente explicación de Barry Wark …

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: @"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!

Simplemente, la lógica sería

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

Ese es solo el operador ternario habitual. 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; 

Esto es parte de C, por lo que no es específico de Objective-C. Aquí hay una traducción a una statement if :

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

Es solo una forma corta de escribir una statement if-then-else. Significa lo mismo que el siguiente código:

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

Es un operador ternario, como una instrucción if / else.

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

En el 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 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 todos mencionaron eso, es una forma de representar al operador condicional

 if (condition){ true } else { false } 

usando operador ternario (condition)? true:false (condition)? true:false Para agregar información adicional, ¿En breve 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 ?: podemos usar ?? es rápido

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

medio

 int padding; if ([[UIScreen mainScreen] bounds].size.height <= 480) padding = 15; else padding = 55; 

Ejemplo de operador ternario. Si el valor de la variable booleana isFemale es SÍ, imprima “GENDER IS FEMALE”, de lo contrario “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. 

C objective

 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 Object-C si quieres verificar null / nil 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] : @""; } 

Luego puedes actualizarlo de la manera más simple:

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

Porque en Objective-C:

  1. si un objeto es nulo, devolverá falso como booleano;
  2. El segundo parámetro del operador Ternary puede estar vacío, ya que devolverá el resultado a la izquierda de ‘?’

Entonces, digamos que escribes:

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

el segundo parámetro devuelve un valor booleano, por lo que se lanza una excepción.