2014-12-04 20 views
10

Khi cố gắng tạo Trình trợ giúp khởi chạy theo tài liệu của Apple (và tutorial-ized), có vẻ như tôi đang gặp trục trặc do chuyển mã Mục tiêu-C sang Swift. .. trình biên dịch của ai không thể thừa hơn trong trường hợp này.Loại 'Boolean' không phù hợp với giao thức 'BooleanType'

import ServiceManagement 

let launchDaemon: CFStringRef = "com.example.ApplicationLauncher" 

if SMLoginItemSetEnabled(launchDaemon, true) // Error appears here 
{ 
    // ... 
} 

Lỗi này có vẻ luôn là:

Type 'Boolean' does not conform to protocol 'BooleanType'

Tôi đã cố gắng đúc để Bool ở một số địa điểm, trong trường hợp tôi chỉ đơn giản là làm việc với một redundant, archaic primitive (hoặc đưa vào bởi Obj-C hoặc Core Foundation), không có kết quả.

Chỉ trong trường hợp, tôi đã cố gắng đúc phản ứng:

SMLoginItemSetEnabled(launchDaemon, true) as Bool

trong đó sản lượng các lỗi:

'Boolean' is not convertible to 'Bool'

... nghiêm túc?

+0

thân yêu Chris, bạn có thể thêm skype của tôi không: [email protected] và giúp tôi triển khai SMLoginItemSetEnabled. Tôi đang trực tuyến ngay bây giờ. Cám ơn rất nhiều. –

Trả lời

17

Boolean là một "di tích lịch sử kiểu Mac" và tuyên bố như

typealias Boolean = UInt8 

vì vậy đây biên dịch:

if SMLoginItemSetEnabled(launchDaemon, Boolean(1)) != 0 { ... } 

Với phương pháp khuyến nông sau cho Boolean loại (và tôi không chắc chắn nếu điều này đã được đăng trước đó, tôi không thể tìm thấy nó ngay bây giờ):

extension Boolean : BooleanLiteralConvertible { 
    public init(booleanLiteral value: Bool) { 
     self = value ? 1 : 0 
    } 
} 
extension Boolean : BooleanType { 
    public var boolValue : Bool { 
     return self != 0 
    } 
} 

bạn chỉ có thể viết

if SMLoginItemSetEnabled(launchDaemon, true) { ... } 
  • Việc gia hạn BooleanLiteralConvertible cho phép chuyển đổi tự động của đối số thứ hai true để Boolean.
  • Phần mở rộng BooleanType cho phép tự động chuyển đổi giá trị trả về Boolean của hàm thành Bool cho câu lệnh if.

Cập nhật: Tính đến Swift 2/Xcode 7 beta 5, các "di tích lịch sử kiểu Mac" Boolean được ánh xạ tới Swift như Bool, mà làm cho phương pháp khuyến nông trên lỗi thời.

+0

Hey tôi thích 'Boolean (1)' - làm cho nó dễ hiểu hơn những gì bạn đang gọi nó với. :) –

+1

@NateCook: OK, đã hoàn nguyên, cảm ơn! –

+0

Có thể đã thề tôi đã thử sự kết hợp này ... Nó hoạt động, mặc dù! Cảm ơn! –

0

Phải, tôi đã gặp sự cố tương tự khi cố gắng lấy lại BOOL của phương thức C mục tiêu trong Swift.

obj-C:

- (BOOL)isLogging 
{ 
    return isLogging; 
} 

Swift:

if (self.isLogging().boolValue) 
    { 
     ... 
    } 

đây là cách mà tôi đã thoát khỏi những sai sót.

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