输入'布尔'不符合协议' BooleanType'

时间:2014-12-04 21:11:41

标签: objective-c xcode swift osx-yosemite

在尝试按照Apple文档(和tutorial-ized)创建启动助手时,我似乎遇到了将Objective-C代码移植到Swift中所造成的打击......谁是编译器在这种情况下,不能再多余了。

import ServiceManagement

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

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

错误似乎一直是:

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

我已尝试在多个地点投放Bool,以防我只是处理redundant, archaic primitive(由Obj-C或Core Foundation引入),果。

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

SMLoginItemSetEnabled(launchDaemon, true) as Bool

产生错误:

'Boolean' is not convertible to 'Bool'

...严重?

2 个答案:

答案 0 :(得分:18)

Boolean是历史悠久的Mac类型"并声明为

typealias Boolean = UInt8

所以这个编译:

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

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

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

你可以写

if SMLoginItemSetEnabled(launchDaemon, true) { ... }
  • BooleanLiteralConvertible扩展程序允许自动转换 第二个参数trueBoolean
  • BooleanType扩展名允许自动转换Boolean 将函数的值返回到Bool的if语句。

更新: Swift 2 / Xcode 7 beta 5,"历史悠久的Mac类型" Boolean 被映射到Swift为Bool,这就是上面的扩展方法 过时。

答案 1 :(得分:0)

是的,我有一个类似的问题试图在Swift中获得BOOL返回一个Objective-C方法。

的OBJ-C:

- (BOOL)isLogging
{
    return isLogging;
}

夫特:

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

这是我摆脱错误的方式。