Swift #6: Opcionales
Source: Dev.to
Opcionales
Algunas veces es necesario indicar la ausencia de valor de una variable. Para estos casos, Swift tiene el modificador ? que convierte cualquier tipo de dato en opcional. Una variable opcional puede tener un valor o estar vacía (su valor es nil).
var result: Int? // Asume nil por defecto
result = 1
result = nil
Inicialización diferida (Implicitly Unwrapped Optionals)
En ocasiones, una variable opcional siempre tendrá un valor cuando se use, pero no se sabe qué valor configurarle inicialmente. Estas variables opcionales se declaran con ! en lugar de ?, y son tratadas como requeridas cuando se usan dentro de una expresión.
var x: Int!
x = 3
var result = x * 2 // 6
No es necesario volver a usar
!al leer el valor dex.
Desempaquetado de opcionales
Desempaquetado forzado (Forced unwrap)
Solo cuando se está 100 % seguro de que el valor de un opcional no es nil, se puede extraer con !.
let optionalValue: Int? = 5
let value = optionalValue! // value: Int = 5
Optional Binding (if let/var, guard let/var)
Para verificar que el valor de un opcional sea distinto de nil y usarlo de forma segura, Swift ofrece la sintaxis de Optional Binding.
var optionalValue: Int? = 5
if let value = optionalValue {
print(value)
}
if var value = optionalValue {
print(value)
}
Reutilizando el mismo nombre
var value: Int? = 5
if let value = value {
print(value)
}
if var value = value {
print(value)
}
A partir de Swift 5.7, cuando el nombre de la constante/variable del Optional Binding coincide con el del opcional, la sintaxis puede abreviarse:
var value: Int? = 5
if let value {
print(value)
}
if var value {
print(value)
}
Uso con guard
guard let value else {
return
}
guard var value else {
return
}
Condiciones adicionales
var value: Int? = 5
if let value, value > 3 {
print(value)
}
Nota: aunque el nombre sea el mismo, la constante/variable del Optional Binding y la opcional original son distintas en memoria.
Optional chaining
let optionalName = optionalValue?.name
Nil‑Coalescing (??)
Devuelve un valor por defecto si el opcional es nil.
let value = optionalNumber ?? 0
Pattern Matching (case let)
let optionalValue: Int? = 77
switch optionalValue {
case let value?:
print(value)
case nil:
print("nil")
}