2015-11-12 17 views
11

Tôi đã viết Boolean thay vì Bool trong một số mã Swift và Xcode đã đề nghị tôi thay thế bằng DarwinBoolean.Loại DarwinBoolean trong Swift

Câu hỏi đặt ra là, chính xác là DarwinBoolean?

Sự khác biệt so với các loại BoolObjCBool là gì. Mục đích của nó là gì?

Trả lời

16

Câu trả lời ngắn:

  • Bool là loại Swift mẹ đẻ cho các giá trị thật.
  • DarwinBoolean là ánh xạ Swift của loại C "lịch sử" Boolean.
  • ObjCBool là ánh xạ Swift của loại Mục tiêu-C BOOL.

Bạn sẽ sử dụng Bool trong mã Swift của bạn trừ khi một trong những loại khác là cần thiết cho khả năng tương tác với Quỹ lõi hiện có hoặc chức năng Objective-C.


Thông tin thêm về DarwinBoolean: DarwinBoolean được định nghĩa trong Swift như

/// 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) 
} 

và là ánh xạ Swift của "lịch sử" C loại Boolean từ 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; 

Xem thêm Xcode 7 R elease Ghi chú:

Loại Boolean trong MacTypes.h được nhập làm Bool trong ngữ cảnh cho phép bắc cầu giữa các loại Swift và Objective-C.

Trong trường hợp biểu thị quan trọng, Boolean được nhập làm kiểu DarwinBoolean riêng biệt, là BooleanLiteralConvertible và có thể được sử dụng trong điều kiện (giống như loại ObjCBool). (19013551)

Như một ví dụ, các chức năng

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

được nhập khẩu để Swift như

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

Trong myFunc1 có một chuyển đổi tự động giữa mẹ đẻ Swift loại Bool và Mac Type Boolean. Điều này không thể thực hiện trong myFunc2 vì địa chỉ của biến số được chuyển qua, tại đây DarwinBoolean chính xác là Loại Mac Boolean.

Trong các phiên bản trước của Swift - nếu tôi nhớ chính xác - loại ánh xạ được gọi là Boolean và đã được đổi tên thành DarwinBoolean sau đó. Nhiều


về ObjCBool: ObjCBool là ánh xạ Swift của Objective-C loại BOOL, này có thể signed char hoặc C/C++ bool loại, tùy thuộc vào kiến ​​trúc . Ví dụ, phương pháp NSFileManager

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

được nhập khẩu để Swift như

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

Ở đây, giá trị BOOL trở lại được chuyển thành Bool tự động, nhưng (BOOL *) được giữ như UnsafeMutablePointer<ObjCBool> bởi vì nó là địa chỉ của một biến.

-1

Thật không may là không có tài liệu thực sự của DarwinBoolean ngoại trừ phần đã được đăng trong câu trả lời trước đây.

Nhưng thường gói Darwin có thể được nhập seperatelly hoặc truy cập thông qua gói Foundation được sử dụng khi bạn muốn sử dụng các hàm toán học.

Giá trị của DarwinBoolean giống với bool bình thường, đúng hoặc sai.

Các vấn đề liên quan