类型'Boolean'不符合协议'BooleanType'

Chr*_*alo 10 xcode objective-c swift osx-yosemite

在尝试根据Apple文档(和教程化)创建启动助手时,我似乎遇到了将Objective-C代码移植到Swift中导致的打嗝...谁的编译器在这方面不再多余案件.

import ServiceManagement

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

if SMLoginItemSetEnabled(launchDaemon, true) // Error appears here
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

错误似乎一直是:

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

我曾尝试Bool在很多地方进行投射,以防我只是处理冗余的,古老的原语(由Obj-C或Core Foundation引入),但无济于事.

为了以防万一,我尝试了回复:

SMLoginItemSetEnabled(launchDaemon, true) as Bool

产生错误:

'Boolean' is not convertible to 'Bool'

......当真?

Mar*_*n R 18

Boolean 是一个"历史性的Mac型"并宣称为

typealias Boolean = UInt8
Run Code Online (Sandbox Code Playgroud)

所以这个编译:

if SMLoginItemSetEnabled(launchDaemon, Boolean(1)) != 0 { ... }
Run Code Online (Sandbox Code Playgroud)

使用以下Boolean类型的扩展方法(我不确定之前是否已发布,我现在无法找到它):

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

你可以写

if SMLoginItemSetEnabled(launchDaemon, true) { ... }
Run Code Online (Sandbox Code Playgroud)
  • BooleanLiteralConvertible扩展允许第二个参数的自动转换trueBoolean.
  • BooleanType扩展允许的自动转换Boolean 的功能,返回值Bool的if语句.

更新:Swift 2/Xcode 7 beta 5开始, "历史Mac类型" Boolean 被映射到Swift as Bool,这使得上述扩展方法已经过时.