我在一些Swift代码中写了Boolean
而不是Bool
,Xcode让我用DarwinBoolean
替换它。
问题是,DarwinBoolean
究竟是什么?
与Bool
和ObjCBool
类型相比有什么不同。
它的目的是什么?
答案 0 :(得分:22)
简短回答:
Bool
是真值的原生Swift类型。DarwinBoolean
是"历史性"的Swift映射。 C类型Boolean
。ObjCBool
是Objective-C类型BOOL
。除非是其他类型之一,否则您将在Swift代码中使用Bool
是与现有Core Foundation或。的互操作性所必需的
Objective-C函数。
有关DarwinBoolean
的更多信息:
DarwinBoolean
在Swift中定义为
/// 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)
}
是"历史性"的Swift映射。 C类型Boolean
来自
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;
另请参阅Xcode 7发行说明:
MacTypes.h中的类型Boolean在上下文中作为Bool导入 允许在Swift和Objective-C类型之间进行桥接。
如果表示很重要,则导入布尔值 作为一个独特的DarwinBoolean类型,它是BooleanLiteralConvertible 并且可以在条件中使用(很像ObjCBool类型)。 (19013551)
例如,函数
void myFunc1(Boolean b);
void myFunc2(Boolean *b);
以
的形式导入Swiftpublic func myFunc1(b: Bool)
public func myFunc2(b: UnsafeMutablePointer<DarwinBoolean>)
在myFunc1
中,原生之间会有自动转换
Swift类型Bool
和Mac类型Boolean
。
这在myFunc2
中是不可能的,因为变量的地址
传递过来,此处DarwinBoolean
正好是Mac类型Boolean
。
在以前版本的Swift中 - 如果我没记错的话 - 这是映射的
类型名为Boolean
,稍后已重命名为DarwinBoolean
。
有关ObjCBool
的更多信息:
ObjCBool
是Objective-C类型BOOL
的Swift映射,
这可以是signed char
或C / C ++ bool
类型,具体取决于
建筑。例如,NSFileManager
方法
- (BOOL)fileExistsAtPath:(NSString *)path
isDirectory:(BOOL *)isDirectory
以
的形式导入Swiftfunc fileExistsAtPath(_ path: String,
isDirectory isDirectory: UnsafeMutablePointer<ObjCBool>) -> Bool
此处BOOL
返回值会自动转换为Bool
,
但(BOOL *)
保留为UnsafeMutablePointer<ObjCBool>
因为它是变量的地址。
答案 1 :(得分:0)
不幸的是,除了在前一个答案中发布的部分之外,没有DarwinBoolean的真实文档。
但是,当您想要使用数学函数时,通常会使用可以单独导入或通过Foundation包访问的Darwin包。
DarwinBoolean
的值与普通的bool相同,无论是真还是假。