小编典典

类型“布尔”不符合协议“布尔类型”

swift

尝试按照Apple文档(和教程化的)创建Launch Helper时,我似乎遇到了麻烦,原因是将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在多个位置进行转换,以防万一我只是在处理一个多余的,古老的原语(由Obj-
C或Core Foundation引入)而无济于事。

为了以防万一,我尝试投射响应:

SMLoginItemSetEnabled(launchDaemon, true) as Bool

产生错误:

'Boolean' is not convertible to 'Bool'

…严重吗?


阅读 345

收藏
2020-07-07

共1个答案

小编典典

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开始, “ historic Mac type” Boolean
被映射为Swift Bool,使得上述扩展方法已过时。

2020-07-07