2014-11-13 8 views
8

ich nach einem Weg suchen einen Swift Bool prägnant in einem einzigen if Aussage, zu bewerten, wenn die Bool die Eigenschaft eines optionalen Objekt ist:auswerten Bool Eigenschaft optional Objekt in if-Anweisung

var objectWithBool: ClassWithBool? 
// ... 

if let obj = objectWithBool { 
    if obj.bool { 
     // bool == true 
    } else { 
     // bool == false 
    } 
} else { 
    // objectWithBool == nil 
} 

Gibt es sind diese if Anweisungen zu kombinieren? In Objective-C dies leicht geschehen könnte, als ein nil Objekt im selben Ausdruck ausgewertet werden:

if (objectWithBool.bool) { 
    // bool == true 
} else { 
    // bool == false || objectWithBool == nil 
} 

Antwort

14

Ah, fand es:

if objectWithBool?.bool == true { 
    // objectWithBool != nil && bool == true 
} else { 
    // objectWithBool == nil || bool == false 
} 

Der optionale Verkettungs Ausdruck objectWithBool?.bool gibt eine optionales Bool . Da es optional ist, würde dieser Ausdruck allein in der if-Anweisung zu true/false basierend darauf ausgewertet werden, ob das optionale einen Wert enthält oder nicht.

Durch die Verwendung des == Operator die if Anweisung den Wert des optional überprüft, die in diesem Fall kann true, false oder nil sein.

+0

Ich würde nicht sagen, dass es *“ zwingt das optionale Bool zur Auswertung "*. 'objectWithBool? .bool' kann' true', 'false' oder' nil' sein ('== Optional .None'), und der Vergleich' == true' ergibt nur im ersten Fall 'true'. –

+1

@MartinR Stimmt, ich war da etwas übereilt. Ich habe die Erklärung ein wenig erweitert - hoffentlich macht es jetzt mehr Sinn. – Stuart

4

Eine andere mögliche Lösung ist:

if objectWithBool?.bool ?? false { 
    println("objectWithBool != nil && objectWithBool.bool == true") 
} else { 
    println("objectWithBool == nil || objectWithBool.bool == false") 
} 

Die "nil coalescing operator"a ?? b ist eine Abkürzung für

a != nil ? a! : b 
+0

Danke @MartinR. Ich mag den Null-Koaleszenz-Operator, er kann einen wirklich ordentlichen Code produzieren. Ich würde argumentieren, dass hier etwas weniger klar ist, als nach "Gleichheit" mit "wahr" zu suchen, da auf einen Blick die Anwesenheit von "falsch" aussehen könnte, als ob die Logik umgekehrt wäre. Gute Idee aber! – Stuart

+0

@Stuart: Das hängt davon ab, wie Sie es betrachten. Wenn ich von (klarem) C komme, bevorzuge ich 'if boolVar {}' zu 'if boolVar == true {}' und dann '?? false "wirkt als Standardwert. Und es funktioniert auch für andere Typen, zum Beispiel 'if (myArray? .count ?? 0)> 0'. - Es ist also nur eine Frage der persönlichen Präferenz :) –

+0

Sie haben Recht, und ich bevorzuge auch 'if boolvar {}' wo immer möglich. Ich nehme an, ich meine, es könnte im naiven Sinne verwirrend sein, dass man auf den ersten Blick fälschlicherweise meinen könnte, der Ausdruck würde auf "Güte" mit "falsch" prüfen. Ich werde wahrscheinlich meine Meinung ändern, wenn ich mich daran gewöhnt habe, den Operator '??' zu lesen :) – Stuart

0

könnten Sie auch tun:

if let obj = objectWithBool where obj { 
    // objectWithBool != nil && obj == true 
} else { 
    // objectWithBool == nil || obj == false 
} 
+0

Dies ist nützlich, wenn Sie das ausgepackte 'Bool' im' if' Block verwenden müssen, andernfalls sollten Sie die Variable mit ablegen 'if let _ = objectWithBool ...', oder benutze eine der anderen Antworten. Beachten Sie auch, dass in Swift 3 die Syntax in 'if obj = objectWithBool, obj {...} else {...}' geändert wurde – Stuart

Verwandte Themen