2015-10-01 14 views
6

So in Objective-C überprüft, wenn Boolesche Werte mit, es ist möglich, und ermutigt, zu schreiben Code, um einen Nicht-Null-Wert der Variablen verwendet, wie es boolean Wert ist, was bedeutet, dass Sie Code wie folgt schreiben:Swift Boolean

if (someBool) { 
    // Stuff 
} 

auch gibt es Gründe, warum Code wie folgt abgeraten:

if (someBool == YES) { 
    // Might run into problems here 
} 

die Gründe, warum eine boolean gegen eine andere boolean Kontrolle sind besser erklärt here, aber kurz die Frage ist nur, dass, wenn Sie Gleichheit YES sind zu vergleichen oder NO direkt, Sie vergleichen tatsächlich gegen 1 und 0, jeweils. Da Objective-C die Verwendung von Nicht-Null-Werten als Wahrheitswert zulässt, könnte man am Ende etwas vergleichen, das als wahr betrachtet werden sollte, gegen YES, und den Ausdruck auf NO, z.

int trueNumber = 2; 
if (trueNumber == YES) { 
    // Doesn't run because trueNumber != 1 
} 

Ist dies immer noch ein Problem in Swift? Code style Probleme beiseite, wenn ich etwas wie das folgende sehe

wird das ein Problem sein, oder spielt es nicht wirklich eine Rolle? Sind diese C-style-Vergleiche immer noch unter der Haube oder ist etwas in den Swift BooleanType eingebaut, das diese Probleme verhindert?

Antwort

2

Die if <something> {} Struktur in Swift die <something> erfordert zum BooleanType Protokoll entsprechen, die ist wie folgt definiert:

public protocol BooleanType { 
    /// The value of `self`, expressed as a `Bool`. 
    public var boolValue: Bool { get } 
} 

Wenn der Typ dieses Protokoll nicht entspricht, wird ein Kompilierungsfehler ausgelöst n. Wenn Sie nach diesem Protokoll in der Standardbibliothek suchen, finden Sie, dass der einzige Typ, der diesem Protokoll entspricht, Bool selbst ist. Bool ist ein Typ, der entweder true oder false sein kann. Denken Sie nicht an die Nummer 1 oder 0, sondern eher an Ein/Aus Rechts/Falsch.

Nun kann dieses Protokoll durch eine Nenntyp angepasst werden Sie wollen, zB:

extension Int : BooleanType { 
    public var boolValue : Bool { 
     return self > 0 
    } 
} 

Nun, wenn Sie dies tun (man nicht ehrlich sollte), sind Sie es selbst zu definieren, was „wahr "und" Falsch "bedeutet. Jetzt würde Sie in der Lage sein, es so zu verwenden (wieder, dies nicht tun):

if 0 { 
    ... 
} 
+0

Okay, also ist der Grund, warum der Code, der in Objective-C ein Problem war, kein Problem ist, einfach wegen der strengen Typprüfung in Swift? Es scheint so, als ob ein Typ, um in booleschen Überprüfungen in Swift verwendet zu werden, im Grunde genommen einen strikt typisierten "Bool" (wie Sie oben gezeigt haben) zurückgeben muss, was das Problem vermeidet, dass C und Objective-C mit dem '' hatten typedef signiertes Zeichen. Ist es genauso einfach? – Ziewvater

+0

@Ziewvater Yup, korrekt – Kametrixom

2

Swift hat Bool-Typ. Dies unterscheidet sich von objective-cs BOOL, das nicht der tatsächliche Typ ist. Es ist eigentlich typedef unsigned char. Wenn swift Bool erwartet, musst du es Bool geben, sonst ist es Kompilierfehler. Der folgende Code kompiliert nicht, weil Scheck nicht

let check = 2 
if check { 
} 

bool Aber das wird funktionieren, weil == kehrt Bool

let check = 2 
if check == 2 { 
} 
+0

Eigentlich 'Bool' ist seine eigene Art in Swift und * nicht * eine Art Alias" unsigned char "(was in Swift" CnsignedChar "wäre). –

+0

Sorry ich meine Objective-C nicht swift – mustafa

+0

Nun, es ist komplizierter in Objective-C, vergleiche http://stackoverflow.com/questions/31267325/bool-with-64-bit-on-ios. –

0

den ObjC Stil zu verstehen, müssen Sie C. zurück gehenIn C, diese Aussage:

if (something) { 
    // Do something 
} 

wird false bewerten, wenn something null oder 0 ist alles andere true bewerten. Das Problem ist, dass C keinen booleschen Typ hat. Objective-C hinzugefügt YES und NO das ist im Grunde 1 und 0. Also:

if (aBoolValue == YES) { } // Work as expected 
if (anIntValue == YES) { } // False unless anIntValue == 1 

Die „entmutigte“ Empfehlung war mit dem Verhalten in C. Swift auszurichten hat keine solche Abwärtskompatibilität Anforderungen. Sie können diese nicht schreiben:

Stattdessen wird der Ausdruck in einen Booleschen Wert bewerten müssen:

if anIntValue != 0 { } // Ok 
if anObject != nil { } // Ok