什么是Swift中的DarwinBoolean类型

时间:2015-11-12 08:41:41

标签: swift

我在一些Swift代码中写了Boolean而不是Bool,Xcode让我用DarwinBoolean替换它。

问题是,DarwinBoolean究竟是什么?

BoolObjCBool类型相比有什么不同。 它的目的是什么?

2 个答案:

答案 0 :(得分:22)

简短回答:

  • Bool是真值的原生Swift类型。
  • DarwinBoolean是"历史性"的Swift映射。 C类型Boolean
  • ObjCBool是Objective-C类型BOOL
  • 的Swift映射

除非是其他类型之一,否则您将在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);

的形式导入Swift
public 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

的形式导入Swift
func fileExistsAtPath(_ path: String,
      isDirectory isDirectory: UnsafeMutablePointer<ObjCBool>) -> Bool

此处BOOL返回值会自动转换为Bool, 但(BOOL *)保留为UnsafeMutablePointer<ObjCBool> 因为它是变量的地址

答案 1 :(得分:0)

不幸的是,除了在前一个答案中发布的部分之外,没有DarwinBoolean的真实文档。

但是,当您想要使用数学函数时,通常会使用可以单独导入或通过Foundation包访问的Darwin包。

DarwinBoolean的值与普通的bool相同,无论是真还是假。