Una de las cosas que nos ha traído de cabeza a los programadores a lo largo de los tiempos es qué ocurre cuando una de las variables que tenemos en nuestro código carece de valor. En este caso el lenguaje de programación Swift pretende dar una nueva vuelta de tuerca al problema
Nos va a permitir el uso de un nuevo concepto denominado Opcionales (Optionals) en situaciones donde hemos de permitir una ausencia de valor para una variable. Si ya sois unos programadores experimentados en el mundo Apple lo primero que tenéis que saber es que los opcionales no existen ni en el lenguaje C ni en el lenguaje Objective-C. Es este último, lo más aproximado que tenemos para llegar a los opcionales en Swift es la posibilidad de, por ejemplo, devolver un valor de tipo nil en un método M siempre que este método retorne un objeto. Significará entonces que M va a devolver un objeto que no es válido y lo tendremos que tener en cuenta a la hora de su manipulación para evitar errores en tiempo de ejecución.
Sin embargo, como os comentaba, esto solamente sirve para trabajar con objetos. El problema viene cuando tenemos estructuras de datos, tipos básicos en C, o enumeraciones. Para este tipo de datos, los métodos en Objetive-C típicamente devuelven un valor especial (como un objeto de tipo NSNotFound, una constante numérica, etc.) que indicará la ausencia de un valor. El programador que use este enfoque asume que la llamada al método va a devolver un valor especial y tendrá que realizar las comprobaciones pertinentes en el código.
Opcionales en Swift
Los opcionales en Swift permiten indicar la ausencia de un valor para cualquier tipo de dato sin necesidad de usar constantes especiales. El siguiente ejemplo muestra el uso de opcionales en Swift para poder hacer frente a la ausencia de un valor. Una constante de tipo String tiene un método llamado toInt que intenta convertir un valor String (cadena de caracteres) a un valor Int (número entero). Sin embargo, como es obvio no todas las cadenas de caracteres pueden ser convertidas a un número entero. La cadena “123” puede ser convertida al numero 123 pero la cadena “hola mundo” no por no tener una posible representación de un entero.
let posibleNumero = »123″
let numeroConvertido = posibleNumero.toInt()
// la constante numeroConvertido será de tipo «Int?» ó “Int opcional»
Debido a que el método toInt puede fallar, va a devolver un Int opcional en lugar de un Int. Un opcional Int es escrito como Int? en lugar de Int a secas. El símbolo interrogación cerrada indica que el valor que puede contener la variable/constante es opcional, es decir, puede contener cualquier valor entero o puede contener ningún valor. (No puede contener otra cosa, como un valor Bool o un valor String. O es un Int, o no es nada). Podremos establecer una variable opcional a un estado sin valor mediante el valor especial nil como vemos en el siguiente ejemplo:
var codigoRespuestaServidor: Int? = 404
// la variable codigoRespuestaServidor contiene el valor Int 404
codigoRespuestaServidor = nil
// la variable codigoRespuestaServidor ahora no contiene ningún valor
Tenemos que tener en cuenta que el valor nil no puede ser usado con variables y constantes no opcionales. Si una constante o variable en nuestro código fuente necesita trabajar con ausencia de valor en unas determinadas condiciones siempre hemos de declararla como un valor opcional del tipo que necesitemos, tal y como hemos visto en los ejemplo anteriores. Si definimos una variable o constante opcional sin inicializar, es decir, sin un valor inicial el compilador de XCode establecerá el valor nil por defecto para la misma.
var respuesta: String?
// la variable respuesta será inicializada por defecto a nil
Para terminar con este artículo hemos de decir que el valor nil en Swift no es lo mismo que el valor nil en Objetive-C. En Objetive-C nil es un puntero a un objeto inexistente mientras que en Swift NO es un puntero, sino que es la ausencia de cualquier valor. Los opcionales en Swift de cualquier tipo pueden ser establecidos a nil, no solo los objetos.
Pues hasta aquí el concepto de opcionales en Swift. Espero que te haya parecido interesante el nuevo concepto que nos propone Apple para el tratamiento de la ausencia de valor en nuestras variables/constantes y que seguro que nos va a facilitar bastante la prevención de errores y la depuración de nuestras aplicaciones. De todas maneras, si tienes alguna duda ponte en contacto conmigo mediante este formulario y estaré gustoso de atenderte. Nos leemos en el próximo!
Adiós, os!