Enlace opcional
Swift 3 y 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Swift 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
El código let booleanValue = booleanValue
devuelve false
si booleanValue
es nil
y el if
bloque no se ejecuta. Si booleanValue
no es así nil
, este código define una nueva variable denominada booleanValue
de tipo Bool
(en lugar de opcional Bool?
).
El código Swift 3 y 4 booleanValue
(y el código Swift 2.2 where booleanValue
) evalúa la nueva booleanValue: Bool
variable. Si es cierto, el if
bloque se ejecuta con la booleanValue: Bool
variable recién definida en el alcance (lo que permite que la opción haga referencia al valor enlazado nuevamente dentro del if
bloque).
Nota: Es una convención de Swift nombrar la constante / variable ligada de la misma manera que la constante / variable opcional como let booleanValue = booleanValue
. Esta técnica se denomina sombreado variable . Podrías romper con las convenciones y usar algo como let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. Señalo esto para ayudar a comprender lo que está sucediendo. Recomiendo usar sombreado variable.
Otros enfoques
Nil coalescencia
La fusión nula es clara para este caso específico
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
La comprobación false
no es tan clara
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Nota: if !booleanValue ?? false
no se compila.
Forzar desenvolver opcional (evitar)
Forzar el desenvolvimiento aumenta la posibilidad de que alguien haga un cambio en el futuro que compila pero falla en tiempo de ejecución. Por lo tanto, evitaría algo como esto:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Un enfoque general
Aunque esta pregunta de desbordamiento de pila pregunta específicamente cómo verificar si a Bool?
está true
dentro de una if
declaración, es útil identificar un enfoque general, ya sea verificar verdadero, falso o combinar el valor sin envolver con otras expresiones.
A medida que la expresión se vuelve más complicada, encuentro que el enfoque de enlace opcional es más flexible y más fácil de entender que otros enfoques. Tenga en cuenta que las obras de enlace opcionales con cualquier tipo opcional ( Int?
, String?
, etc.).