Los opcionales en Swift

banner swift

Hola! hace un tiempo que no escribo ningún articulo para el blog, demasiado trabajo 😰 . Voy a retomar los artículos que tenia pendientes con un repaso a los opcionales en el lenguaje de programación Swift.

¿Qué es un opcional?

Un opcional en Swift es un tipo de dato que puede contener o no un valor. Los opcionales se definen agregando un símbolo de interrogación (?) al final de la declaración de la variable:

var valor: String?

El opcional es declarado, cuando no sabemos si esa variable va a contener un dato, imaginemos que el usuario no introduce un dato en un cuadro de texto de nuestra aplicación IOS.

Imaginemos la variable valor como un contenedor, una caja de la cual solo sabemos que puede almacenar valores de tipo String, pero no sabemos si actualmente almacena un valor o por el contrario está vacía, o mejor dicho es igual a nil.

¿Qué es Nil?
El valor especial nil, establece un estado sin valor a una variable  de tipo optional, por lo que una buena manera de proceder sería la comprobación de la variable antes de usarla:

var nombre: String?

if nombre == nil {

print("La variable nombre es igual a nil!")

}

nombre = "Jesus"

if nombre == nil {

print("La variable nombre es igual a nil!")

} else {

print("La variable nombre es igual al valor: \(nombre)")

}

Optional
Seguramente muchos se preguntarán porqué cuando imprimimos la variable nombre se muestra su valor como:

Optional(«Jesus»)

Lo que sucede es que estamos viendo el envoltorio, la caja del ejemplo que os indiqué. Cuando establecemos una variable como opcional y utilizamos la siguiente sintaxis (que es la recomendada):

var nombre: String?

Lo que estamos declarando es un contenedor, de tipo Optional, dentro del cual podrá haber un valor de tipo String. Por lo que el tipo String de existir siempre estará dentro de este envoltorio o wrapper (como se le llama en inglés).

Mientras que en una variable regular el valor de la misma se encuentra asociado directamente a esta y podemos acceder a él sin más. En el caso de las variables opcionales esto no es así, el posible valor de una variable opcional siempre se encuentra dentro de «la caja», dentro del contenedor, dentro del tipo Optional.

Así que al imprimirlo o nos devolverá nil o su valor asociado en formato: Optional(VALOR).

Creo que podemos entender por qué Optional es un tipo especial. No es como Int o String, es de hecho un enum. Uno similar a este:

enum Optional {

case none
case some(Wrapped)

} // Optional

Entonces sí queremos trabajar con el valor que almacenamos en la caja, en el contenedor o wrapper, primero tenemos que sacarlo de ella.

Para esto existen varios enfoques, unos más seguros y otros más inseguros y no recomendados. Este último sería el force unwrapping o desempaquetamiento forzado si lo traducimos al castellano,

El force unwrapping es la manera más directa de acceder al valor de una variable opcional y lo hacemos mediante el signo de fin admiración («!»), siguiendo esta sintaxis:

valor!

tal y como podemos observar en este ejemplo:

var nombre: String?

nombre = «Pedro»

print(String(describing: nombre!))
la salida en pantalla sería: Pedro

Nota que hemos accedido al valor como tal y no al anterior Optional(«Jesus»).

¿Por qué es peligroso?
Que sucedería si modificásemos el último ejemplo al siguiente:

var nombre: String?

print(String(describing: nombre!))

obtendríamos un error como este:

Fatal error: Unexpectedly found nil while unwrapping an Optional value

El mensaje de error nos informa que ha ocurrido un error fatal mientras se desempaquetaba un valor opcional, se ha encontrado nil de manera inesperada en lugar del valor esperado, en este caso String, por esta razón es que no se recomienda su uso, y es que por equivocación o por algún error lógico, una variable opcional puede eventualmente ser igual a nil y hacer que nuestra aplicación deje de funcionar, algo que siempre debemos evitar.

Optional Binding

Al igual que el desempaquetamiento forzado (forced unwrapping), el optional binding es una forma mucho más segura de acceder a los valores dentro del contenedor (la caja).

Veamos un ejemplo:

var nombre: String?

nombre = «Sergio»

if let safeNombre = nombre {

print(«El segundo nombre del usuario es: \(safeNombre)»)

} else {

print(«El usuario no tiene segundo nombre!»)

}

El optional binding toma lugar en el if, y como pueden observar lo hace de una forma bastante singular. La condición de este if reside en que se pueda definir una constante a partir del valor que podría almacenar la variable opcional, caso contrario se ejecutaría el bloque else.

Espero que este articulo os haya gustado, si es así comparte!

Jesús Jiménez

  • Share:

Deja un comentario

Your email address will not be published.

    Enviar un mensaje




    Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

    ACEPTAR
    Aviso de cookies
    Call Now Button