Opcjonalne wiązanie
Swift 3 i 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)'")
}
Kod let booleanValue = booleanValuezwraca falseifbooleanValue jest, nila ifblok nie jest wykonywany. Jeśli booleanValuenie nil, ten kod definiuje nową zmienną o nazwie booleanValuetype Bool(zamiast opcjonalnej Bool?).
Kod Swift 3 i 4 booleanValue(oraz kod Swift 2.2 where booleanValue) ocenia nową booleanValue: Boolzmienną. Jeśli to prawda, ifblok jest wykonywany z nowo zdefiniowaną booleanValue: Boolzmienną w zakresie (umożliwiając opcję ponownego odniesienia do wartości związanej w ifbloku).
Uwaga: Konwencją języka Swift jest nazwanie powiązanej stałej / zmiennej tak samo, jak opcjonalnej stałej / zmiennej, takiej jak let booleanValue = booleanValue . Ta technika nazywa się zmiennym cieniowaniem . Możesz zerwać z konwencją i użyć czegoś w rodzaju let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue. Wskazuję na to, aby pomóc zrozumieć, co się dzieje. Polecam używanie zmiennego cieniowania.
Inne podejścia
Brak koalescencji
W tym konkretnym przypadku wyraźna jest koalescencja zerowa
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
Sprawdzanie dla false nie jest tak jasne
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Uwaga: if !booleanValue ?? false nie kompiluje się.
Wymuś rozpakowywanie opcjonalne (unikaj)
Wymuszanie rozpakowywania zwiększa szansę, że ktoś w przyszłości dokona zmiany, która kompiluje się, ale ulega awarii w czasie wykonywania. Dlatego unikałbym czegoś takiego:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Podejście ogólne
Chociaż to pytanie o przepełnienie stosu pyta konkretnie, jak sprawdzić, czy a Bool?znajduje się truewif instrukcji, pomocne jest określenie ogólnego podejścia, czy sprawdzanie wartości prawda, fałsz czy łączenie nieopakowanej wartości z innymi wyrażeniami.
Ponieważ wyrażenie staje się bardziej skomplikowane, uważam, że opcjonalne podejście wiążące jest bardziej elastyczne i łatwiejsze do zrozumienia niż inne podejścia. Należy zauważyć, że ewentualne prace związaniu z dowolnego typu (opcjonalnie Int?, String?itp).