2015-11-12 13 views
11

Ich habe geschrieben Boolean anstelle von Bool in einigen Swift-Code und Xcode bot mir an, es durch DarwinBoolean zu ersetzen.Was ist DarwinBoolean Typ in Swift

Die Frage ist, was genau ist DarwinBoolean?

Was sind die Unterschiede im Vergleich zu Bool und ObjCBool Typen. Was ist der Zweck?

Antwort

16

Kurze Antwort:

  • Bool ist der native Swift Typ für Wahrheitswerte.
  • DarwinBoolean ist das Swift-Mapping des "historischen" C-Typs .
  • ObjCBool ist das Swift-Mapping des Objective-C-Typs BOOL.

Sie würden Bool in Ihrem Swift Code verwenden, es sei denn, eine der anderen Arten für die Interoperabilität mit bestehenden Core Foundation oder Objective-C-Funktionen erforderlich ist.


Mehr über DarwinBoolean: DarwinBoolean wird in Swift definiert als

/// The `Boolean` type declared in MacTypes.h and used throughout Core 
/// Foundation. 
/// 
/// The C type is a typedef for `unsigned char`. 
public struct DarwinBoolean : BooleanType, BooleanLiteralConvertible { 
    public init(_ value: Bool) 
    /// The value of `self`, expressed as a `Bool`. 
    public var boolValue: Bool { get } 
    /// Create an instance initialized to `value`. 
    public init(booleanLiteral value: Bool) 
} 

und ist der Swift-Mapping der "historischen" C Typ Boolean von MacTypes.h:

/******************************************************************************** 

    Boolean types and values 

     Boolean   Mac OS historic type, sizeof(Boolean)==1 
     bool   Defined in stdbool.h, ISO C/C++ standard type 
     false   Now defined in stdbool.h 
     true   Now defined in stdbool.h 

*********************************************************************************/ 
typedef unsigned char     Boolean; 

Siehe auch den Xcode 7 R elease Hinweise:

Der Typ Boolean in MacTypes.h als Bool importiert in Kontexten, dass zwischen Swift und Objective-C-Typen überbrücken lassen.

In Fällen, in denen die Darstellung von Bedeutung ist, ist Boolean als eigenständiger DarwinBoolean Typ importiert, das ist BooleanLiteralConvertible und kann unter den Bedingungen (ähnlich wie der ObjCBool ​​Typ) verwendet werden. (19013551)

Als Beispiel können die Funktionen

void myFunc1(Boolean b); 
void myFunc2(Boolean *b); 

als

public func myFunc1(b: Bool) 
public func myFunc2(b: UnsafeMutablePointer<DarwinBoolean>) 

In myFunc1 zu Swift importiert eine automatische Konvertierung zwischen dem nativen Swift Typ Bool und der Mac-Typ . Dies ist nicht möglich in myFunc2, weil die Adresse einer Variablen herumgereicht wird, hier DarwinBoolean ist genau der Mac-Typ .

In früheren Versionen von Swift - wenn ich mich richtig erinnere - die abgebildet Typ Boolean genannt wurde, und wird zu DarwinBoolean später umbenannt.


Mehr über ObjCBool: ObjCBool ist das Swift-Mapping des Objective-C-Typs BOOL, dies kann signed char oder den C/C++ bool Typ sein, abhängig von der Architektur. Zum Beispiel kann die NSFileManager Methode

- (BOOL)fileExistsAtPath:(NSString *)path 
     isDirectory:(BOOL *)isDirectory 

als

func fileExistsAtPath(_ path: String, 
     isDirectory isDirectory: UnsafeMutablePointer<ObjCBool>) -> Bool 

Hier der BOOL Rückkehr zu Swift importierten Wert Bool automatisch umgewandelt wird, aber die (BOOL *) als UnsafeMutablePointer<ObjCBool> gehalten, weil es die ist Adresse einer Variablen.

-1

Leider gibt es keine echte Dokumentation von DarwinBoolean außer dem Teil, der in der vorherigen Antwort gepostet wurde.

Im Allgemeinen wird jedoch das Darwin-Paket verwendet, das separat importiert oder über das Foundation-Paket aufgerufen werden kann, wenn Sie mathematische Funktionen verwenden möchten.

Der Wert des DarwinBoolean ist der gleiche wie der normale bool, wahr oder falsch.