Wenn ich überprüfen möchte, ob ein optionaler Bool wahr ist, funktioniert dies nicht:
var boolean : Bool? = false
if boolean{
}
Dies führt zu diesem Fehler:
Optionaler Typ '@IvalueBool?' kann nicht als Boolescher Wert verwendet werden; Teste stattdessen auf '! = nil'
Ich möchte nicht nach Null suchen. Ich möchte überprüfen, ob der zurückgegebene Wert wahr ist.
Muss ich immer tun, if boolean == true
wenn ich mit einem optionalen Bool arbeite?
Sollte BooleanType
der Compiler nicht wissen, dass ich den Wert des Bool überprüfen möchte, da Optionals nicht mehr den Anforderungen entsprechen?
Antworten:
Bei optionalen Booleschen Werten muss die Prüfung explizit erfolgen:
Andernfalls können Sie das optionale auspacken:
Aber das erzeugt eine Laufzeitausnahme, wenn boolean ist
nil
- um das zu verhindern:Vor Beta 5 war dies möglich, aber es wurde geändert, wie in den Versionshinweisen angegeben:
Nachtrag: Wie von @MartinR vorgeschlagen, verwendet eine kompaktere Variante der dritten Option den Koaleszenzoperator:
Dies bedeutet: Wenn der Boolesche Wert nicht Null ist, wird der Ausdruck als Boolescher Wert ausgewertet (dh unter Verwendung des nicht umschlossenen Booleschen Werts), andernfalls wird der Ausdruck als ausgewertet
false
quelle
if let
würde auch funktionieren.if boolean ?? false { ... }
.if !(boolean ?? true) { ... }
:: :(Optionale Bindung
Schnelle 3 & 4
Swift 2.2
Der Code
let booleanValue = booleanValue
gibt ,false
wennbooleanValue
istnil
und derif
Block wird nicht ausgeführt. Wenn diesbooleanValue
nicht der Fall istnil
, definiert dieser Code eine neue Variable mit dem NamenbooleanValue
typeBool
(anstelle einer optionalen VariablenBool?
).Der Swift 3 & 4-Code
booleanValue
(und der Swift 2.2-Codewhere booleanValue
) wertet die neuebooleanValue: Bool
Variable aus. Wenn dies der Fall ist, wird derif
Block mit der neu definiertenbooleanValue: Bool
Variablen im Gültigkeitsbereich ausgeführt (sodass die Option den gebundenen Wert innerhalb desif
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 verwendenlet 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
Das Überprüfen auf
false
ist nicht so klarHinweis:
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:
Ein allgemeiner Ansatz
Obwohl diese Stack - Überlauf Frage ausdrücklich fragt , wie zu überprüfen , ob eine
Bool?
isttrue
in einerif
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.).quelle
if let
?while array.last < threshold { array.removeLast() }
if, let, where
:while let last = array.last where last < threshold { array.removeLast() }
in Swift 2 oderwhile let last = array.last, last < threshold { array.removeLast() }
in Swift 3.while let
.quelle
Ich habe eine andere Lösung gefunden, die die Booleschen Operatoren überlastet. Beispielsweise:
Dies ist möglicherweise nicht ganz im "Geist" der Sprachänderungen, ermöglicht jedoch das sichere Auspacken von Optionen und kann für Bedingungen überall verwendet werden, auch für while-Schleifen.
quelle
Die Antwort, die ich am einfachsten zu lesen fand, ist das Definieren einer Funktion. Nicht sehr kompliziert, macht aber die Arbeit.
Verwendung:
quelle
Wie Antonio sagte
Ich habe ein paar Stunden damit verbracht, eine Codezeile zu verstehen, auf die ich gestoßen bin, aber dieser Thread hat mich auf den richtigen Weg gebracht.
Dieses Zitat stammt aus dem August 2014 und wurde seitdem von Apple
Never
nach dem Vorschlag SE-0102 eingeführt. Letzterer hat es an Equatable, Hashable, Error und Comparable angepasstEs ist jetzt möglich zu überprüfen, ob ein Boolescher Wert
nil
verwendetNever?
:Sie können tatsächlich alle anderen unbewohnbaren Typen verwenden:
Abgesehen davon ist es jetzt auch möglich, einen Property Wrapper zu verwenden :
oder auch:
quelle