¿Qué significan el signo de interrogación y los dos puntos (?: operador ternario) en el objetivo-c?

4 minutos de lectura

avatar de usuario
danielreiser

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

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

Él ? y : me confunde.

  • es el ternario si-entonces-otro operador

    – Klaus Byskov Pedersen

    7 abr 2010 a las 19:46

  • Tenga en cuenta que debe ser un signo de interrogación, no una comilla.

    – Clahey

    7 abr 2010 a las 19:48

  • El compilador también parece permitir variable ?: anotherVariable¿Qué significa esto?’

    – Tony

    30 de diciembre de 2011 a las 17:31

  • El ternario sin primer elemento significa lo mismo que (valOrVar != 0) ? valOrVar : anotherValorvar

    – Scott Lahteine

    24 de marzo de 2012 a las 2:11

avatar de usuario
varun goyal

Simplemente, la lógica sería

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

  • Este es en realidad el mejor responda 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.

    – Mike S.

    23 de febrero de 2016 a las 21:19

avatar de usuario
barry wark

esta es la c 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 (p. ej. variable ?: anotherVariable) significa lo mismo que (valOrVar != 0) ? valOrVar : anotherValOrVar

  • (actualización: ¡Qué asco! Volver a publicar como respuesta). Lo que es tan importante sobre el operador ternario es que se puede usar en lugares donde 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: #define statusString (statusBool ? @”Aprobado” : @”Rechazado”) …entonces: [NSString stringWithFormat: @”Status: %@”, statusString] Esto le evita tener que usar y liberar variables locales en patrones if-else. FTW!

    –Bruno Bronosky

    6 mayo 2010 a las 15:52


  • Probablemente valga la pena mencionar que el operador ternario sin el primer elemento (?:) es aun mejor en situaciones en las que el lado izquierdo es una expresión, como el ?: evita que se evalúe más de una vez. Por ejemplo: [myArray firstObject] ? [myArray firstObject] : @"Hello World"; llamadas firstObject dos veces (si firstObject no regresa nil), donde [myArray firstObject] ?: @"Hello World"; produce el mismo resultado pero nunca llama firstObject mas de una vez.

    – nhgrif

    9 de julio de 2014 a las 0:33

  • finalmente~~~~~ He estado usando este operador durante mucho tiempo (definitivamente mi favorito) pero nunca supe cómo se llama. la gran pregunta ahora ha sido respondida. Gracias

    – Thang Do

    10 de noviembre de 2015 a las 7:50

  • También quiero agregar que el operador ternario sin el primer elemento ?: también se llama el operador de elvis debido a la emoticonos parecido con el cantante. Y, por supuesto, en este caso, como estamos soltando un elemento, ya no es un operador ternario pero un operador binario. Los operadores binarios incluyen la gran mayoría de los operadores que solemos usar al programar (*,+,-,^, |,||, &, >>etc).

    – tomaco

    5 de febrero de 2018 a las 18:07


avatar de usuario
sean

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

condition ? valueIfTrue : valueIfFalse

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

  • Solo para aclarar, no se limita a los valores. condition ? codeIfTrue : codeIfFalse

    – Mike S.

    23 de febrero de 2016 a las 21:21

Dato curioso, en Objective-C si quieres marcar nulo/nil 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:

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

Así que digamos que escribes:

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

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

Eso es lo habitual operador ternario. 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;

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 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 rápido

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.

Sobre la base de la excelente explicación de Barry Wark…

Lo que es tan importante sobre el operador ternario es que puede usarse en lugares donde 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 evita tener que usar y liberar variables locales en patrones if-else. FTW!

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad