Operador condicional ternario en Objective-C

En la muchos lenguajes de programación (en los que provienen de C al menos...) existe un operador condicional ternario de la forma
condición ? expresión1 : expresión2
que evalúa la condición, y el resultado de la expresión completa será expresión1 o expresión2 según el la condición evalúe a true o false respectivamente.

En Objecive-C, la condición debe ser evaluable como una expresión booleana, por lo que se puede usar un objeto, y en ese caso el significado es el mismo que preguntar si el objeto es distinto de nil.

Por otro lado, Objective-C adopta una convención del compilador GCC (según esta respuesta en StackOverflow), donde la expresión1 es opciona, pudiendo escribir
condición ? : expresión2
y en ese caso, si la condición es verdadera, será además el resultado de la expresión completa.

¿Para qué sirve todo esto? Sirve por ejemplo para escribir una asignación cuando el valor asignado puede ser nil y en ese caso queremos asignar un valor por defecto. Algo así:
id obj = someValue ? : @"";
Creo que el código queda bastante más simple y entendible (una vez que conocemos como funciona el operador) que hacerlo con if:
id obj = someValue;
if (!obj) {
    obj = @"";
}
También tiene la ventaja que la expresión se evalúa una sola vez, lo cual es útil cuando la expresión puede ser compleja, y necesario cuando la expresión puede tener efectos secundarios.
id obj = [[some complicated] expresion] ? : @"";
Por último, al escribir solamente una vez la expresión que queremos evaluar, eliminamos código duplicado lo que, como todos sabemos, es fuente de errores.

Comentarios

Entradas más populares de este blog

Literales de tipo Date y DateTime en GeneXus

Comando "do case" en GeneXus

No hemos cambiado nada