Reliure facultative
Swift 3 et 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)'")
}
Le code let booleanValue = booleanValue
renvoie false
if booleanValue
is nil
et le if
bloc ne s'exécute pas. Si ce booleanValue
n'est pas le cas nil
, ce code définit une nouvelle variable nommée booleanValue
de type Bool
(au lieu d'un optionnel, Bool?
).
Le code Swift 3 & 4 booleanValue
(et le code Swift 2.2 where booleanValue
) évalue la nouvelle booleanValue: Bool
variable. Si c'est vrai, le if
bloc s'exécute avec la booleanValue: Bool
variable nouvellement définie dans la portée (permettant à l'option de référencer à nouveau la valeur liée dans le if
bloc).
Remarque: C'est une convention Swift de nommer la constante / variable liée de la même manière que la constante / variable optionnelle telle que let booleanValue = booleanValue
. Cette technique s'appelle l' ombre variable . Vous pouvez rompre avec la convention et utiliser quelque chose comme let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. Je le souligne pour aider à comprendre ce qui se passe. Je recommande d'utiliser l'ombre variable.
Autres approches
Nil coalescence
Aucune fusion n'est claire pour ce cas spécifique
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
La vérification false
n'est pas aussi claire
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Remarque: if !booleanValue ?? false
ne compile pas.
Forcer le déballage en option (à éviter)
Le déballage forcé augmente les chances que quelqu'un fasse un changement dans le futur qui se compile mais plante au moment de l'exécution. Par conséquent, j'éviterais quelque chose comme ceci:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Une approche générale
Bien que cette question de débordement de pile demande spécifiquement comment vérifier si a se Bool?
trouve true
dans une if
instruction, il est utile d'identifier une approche générale, qu'il s'agisse de vérifier la valeur true, false ou de combiner la valeur déballée avec d'autres expressions.
Au fur et à mesure que l'expression se complique, je trouve l'approche de liaison facultative plus flexible et plus facile à comprendre que les autres approches. Notez que les travaux de liaison en option avec tout type en option ( Int?
, String?
, etc.).