Swift Language Desenvolviendo un opcional


Ejemplo

Para poder acceder al valor de un opcional, se debe desempaquetar.

Condicionalmente, puede desenvolver un Opcional usando el enlace opcional y forzar el desenvolver un Opcional usando el ! operador.

El desenvolver condicionalmente pregunta "¿Tiene esta variable un valor?" mientras que la fuerza de desenvolvimiento dice "Esta variable tiene un valor".

Si obliga a desenvolver una variable que es nil , su programa arrojará un nulo encontrado inesperadamente mientras desenvuelve una excepción y falla opcionales , por lo que debe considerar cuidadosamente si lo usa ! es apropiado.

var text: String? = nil
var unwrapped: String = text! //crashes with "unexpectedly found nil while unwrapping an Optional value"

Para un desenvolvimiento seguro, puede usar una sentencia if-let , que no arrojará una excepción o bloqueo si el valor envuelto es nil :

var number: Int?
if let unwrappedNumber = number {       // Has `number` been assigned a value?
    print("number: \(unwrappedNumber)") // Will not enter this line
} else {
    print("number was not assigned a value")
}

O, una declaración de guardia :

var number: Int?
guard let unwrappedNumber = number else {
    return
}
print("number: \(unwrappedNumber)")

Tenga en cuenta que el alcance de la variable unwrappedNumber está dentro de la sentencia if-let y fuera del bloque de guard .

Puede encadenar el desenvolvimiento de muchos opcionales, esto es principalmente útil en los casos en que su código requiere más de una variable para ejecutarse correctamente:

var firstName:String?
var lastName:String?

if let fn = firstName, let ln = lastName {
    print("\(fn) + \(ln)")//pay attention that the condition will be true only if both optionals are not nil.
}

Tenga en cuenta que todas las variables deben ser desenvueltas para pasar la prueba con éxito, de lo contrario no tendría forma de determinar qué variables se desenvolvieron y cuáles no.

Puede encadenar declaraciones condicionales usando sus opcionales inmediatamente después de que se desenvuelva. Esto significa que no hay instrucciones anidadas si - si no!

var firstName:String? = "Bob"
var myBool:Bool? = false

if let fn = firstName, fn == "Bob", let bool = myBool, !bool {
    print("firstName is bob and myBool was false!")
}