2010-04-07 22 views
222

¿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.

+2

Tenga en cuenta que esto debería ser un signo de interrogación, no de comillas. – clahey

+0

oops, lo siento, tienes razón. – rdesign

+6

El compilador también parece permitir 'variable?: AnotherVariable', ¿qué significa esto? ' – Tony

Respuesta

375

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

+25

(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! –

+3

¡Y es tan N E A T! – Morkrom

+41

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

4

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; 
4

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; 
160

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

condition ? valueIfTrue : valueIfFalse 

Donde los valores solo se evaluarán si se eligen.

+25

Esto debería haber sido votado más, de manera simple y clara. – Celeritas

+7

Solo para aclarar, no está limitado a valores. 'condición? codeIfTrue: codeIfFalse' –

13

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; 
34

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!

1

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; 
+2

. 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. –

1
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; 
30

Simplemente, la lógica sería

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

+3

simple y elegante – Barracuda

+3

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. –

1

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#).

1

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.

0

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. 
0

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:

  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 '?'

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.

Cuestiones relacionadas