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 = booleanValue
zwraca false
ifbooleanValue
jest, nil
a if
blok nie jest wykonywany. Jeśli booleanValue
nie nil
, ten kod definiuje nową zmienną o nazwie booleanValue
type Bool
(zamiast opcjonalnej Bool?
).
Kod Swift 3 i 4 booleanValue
(oraz kod Swift 2.2 where booleanValue
) ocenia nową booleanValue: Bool
zmienną. Jeśli to prawda, if
blok jest wykonywany z nowo zdefiniowaną booleanValue: Bool
zmienną w zakresie (umożliwiając opcję ponownego odniesienia do wartości związanej w if
bloku).
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ę true
wif
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).