Optionale Bindung
Schnelle 3 & 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
// Executes when booleanValue is not nil and true
// A new constant "booleanValue: Bool" is defined and set
print("bound booleanValue: '\(booleanValue)'")
}
Swift 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
// Executes when booleanValue is not nil and true
// A new constant "booleanValue: Bool" is defined and set
print("bound booleanValue: '\(booleanValue)'")
}
Der Code let booleanValue = booleanValue
gibt , false
wenn booleanValue
ist nil
und der if
Block wird nicht ausgeführt. Wenn dies booleanValue
nicht der Fall ist nil
, definiert dieser Code eine neue Variable mit dem Namen booleanValue
type Bool
(anstelle einer optionalen Variablen Bool?
).
Der Swift 3 & 4-Code booleanValue
(und der Swift 2.2-Code where booleanValue
) wertet die neue booleanValue: Bool
Variable aus. Wenn dies der Fall ist, wird der if
Block mit der neu definierten booleanValue: Bool
Variablen im Gültigkeitsbereich ausgeführt (sodass die Option den gebundenen Wert innerhalb des if
Blocks erneut referenzieren kann ).
Hinweis: Es ist eine Swift-Konvention, die gebundene Konstante / Variable genauso zu benennen wie die optionale Konstante / Variable wie z let booleanValue = booleanValue
. Diese Technik wird als variable Abschattung bezeichnet . Sie könnten von der Konvention abweichen und so etwas verwenden let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. Ich weise darauf hin, um zu verstehen, was passiert. Ich empfehle die Verwendung von variablem Shadowing.
Andere Ansätze
Nichts verschmilzt
Für diesen speziellen Fall ist keine Koaleszenz klar
var booleanValue : Bool? = false
if booleanValue ?? false {
// executes when booleanValue is true
print("optional booleanValue: '\(booleanValue)'")
}
Das Überprüfen auf false
ist nicht so klar
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
// executes when booleanValue is false
print("optional booleanValue: '\(booleanValue)'")
}
Hinweis: if !booleanValue ?? false
Kompiliert nicht.
Optionales Auspacken erzwingen (vermeiden)
Das erzwungene Auspacken erhöht die Wahrscheinlichkeit, dass jemand in Zukunft eine Änderung vornimmt, die kompiliert wird, aber zur Laufzeit abstürzt. Daher würde ich so etwas vermeiden:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
// executes when booleanValue is true
print("optional booleanValue: '\(booleanValue)'")
}
Ein allgemeiner Ansatz
Obwohl diese Stack - Überlauf Frage ausdrücklich fragt , wie zu überprüfen , ob eine Bool?
ist true
in einer if
Aussage, ist es hilfreich , einen allgemeinen Ansatz zu erkennen , ob für eine echte Kontrolle, falschen oder den ungeöffneten Wert mit anderen Ausdrücken kombinieren.
Wenn der Ausdruck komplizierter wird, finde ich den optionalen Bindungsansatz flexibler und verständlicher als andere Ansätze. Beachten Sie, dass optionale Bindung funktioniert mit jedem optional Typ ( Int?
, String?
usw.).