I have written Boolean
instead of Bool
in some Swift code and Xcode offered me to replace it with DarwinBoolean
.
The question is, what exactly is DarwinBoolean
?
What are the differences comparing to Bool
and ObjCBool
types.
What is it's purpose?
Short answer:
Bool
is the native Swift type for truth values.DarwinBoolean
is the Swift mapping of the "historic" C type Boolean
.ObjCBool
is the Swift mapping of the Objective-C type BOOL
.You would use Bool
in your Swift code unless one of the other types
is required for interoperability with existing Core Foundation or
Objective-C functions.
More about DarwinBoolean
:
DarwinBoolean
is defined in Swift as
/// 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)
}
and is the Swift mapping of the "historic" C type Boolean
from
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;
See also the Xcode 7 Release Notes:
The type Boolean in MacTypes.h is imported as Bool in contexts that allow bridging between Swift and Objective-C types.
In cases where the representation is significant, Boolean is imported as a distinct DarwinBoolean type, which is BooleanLiteralConvertible and can be used in conditions (much like the ObjCBool type). (19013551)
As an example, the functions
void myFunc1(Boolean b);
void myFunc2(Boolean *b);
are imported to Swift as
public func myFunc1(b: Bool)
public func myFunc2(b: UnsafeMutablePointer<DarwinBoolean>)
In myFunc1
there is an automatic conversion between the native
Swift type Bool
and the Mac Type Boolean
.
This is not possible in myFunc2
because the address of a variable
is passed around, here DarwinBoolean
is exactly the Mac Type Boolean
.
In previous versions of Swift – if I remember correctly – this mapped
type was called Boolean
, and has been renamed to DarwinBoolean
later.
More about ObjCBool
:
ObjCBool
is the Swift mapping of the Objective-C type BOOL
,
this can be signed char
or the C/C++ bool
type, depending on the
architecture. For example, the NSFileManager
method
- (BOOL)fileExistsAtPath:(NSString *)path
isDirectory:(BOOL *)isDirectory
is imported to Swift as
func fileExistsAtPath(_ path: String,
isDirectory isDirectory: UnsafeMutablePointer<ObjCBool>) -> Bool
Here the BOOL
return value is converted to Bool
automatically,
but the (BOOL *)
is kept as UnsafeMutablePointer<ObjCBool>
because it is the address of a variable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With