Programación de Apps iOS para iPhone con Swift y SwiftUI - LaFactoríaApple

Optional Binding

Esta técnica nos permite asegurarnos que una variable Opcional tiene valor, y si lo tiene podremos extraerlo para su uso posterior.

Ya hemos visto como utilizar un Condicional para hacer un Forced Unwrapping y extraer de manera segura los valores de un Opcional.

var edad : Int?
edad = 25

if edad != nil {
    let muestroEdad = edad!
    print(muestroEdad)
}

Utilizando la técnica del Optional Binding podemos obtener el mismo resultado de una manera más elegante

var edad : Int?
edad = 25

if let muestroEdad = edad {
    print(muestroEdad)
}

Si la Variable Opcional edad tiene valor asignado, entonces lo guarda en la constante temporal muestroEdad y ejecuta el código contenido en el Condicional. El ámbito de la constante muestroEdad está restringido al interior de la propia Función Condicional. Veamos que pasa si intentamos utilizar muestroEdad fuera de ese ámbito.

Como era de esperar, Xcode nos muestra el correspondiente mensaje de error informando que en ese ámbito no está definida la Constante muestroEdad.

Si el valor de muestroEdad va a ser modificado en el interior de la Función Condicional, entonces hay que definirlo como una Variable. Por ejemplo:

var edad : Int?
edad = 25

if var muestroEdad = edad {
    muestroEdad = muestroEdad + 4
    print(muestroEdad)
}

Anidar varios Optionals Bindings

Puede darse la situación de tener que desencapsular dos Opcionales relacionados entre sí mediante la técnica del Optional Binding. En este caso podriamos anidar los distintos Condicionales que entran en juego.

var edad : Int?
edad = 25
var nombre : String?
nombre = "Pedro"

if let muestroEdad = edad {
    if let muestroNombre = nombre{
        print("\(muestroNombre) tiene \(muestroEdad) años")
    }
}

Desencapsulación de múltiples Opcionales

Anidar varios Condicionales puede dar lugar a expresiones bastante complejas y difíciles de leer. Es más elegante desencapsular todos los Opcionales en un único Condicional. La sintaxis sería la siguiente:

var edad : Int?
edad = 25
var nombre : String?
nombre = "Pedro"

if let muestroEdad = edad, let muestroNombre = nombre {
        print("\(muestroNombre) tiene \(muestroEdad) años")
}

Deben cumplirse las dos condiciones para que se ejecute el bloque de código que hay en el interior de la Función Condicional.

Más en esta Sección

  • Operador Nil-Coalescing

  • Desencapsulamiento Implícito

  • Forced Unwrapping

  • Introducción a los Opcionales en Swift