在尝试根据 Apple 文档(和 tutorial-ized)创建 Launch Helper 时,我似乎遇到了由于将 Objective-C 代码移植到 Swift 中而引起的问题……谁的编译器不能再这样了在这种情况下是多余的。
import ServiceManagement
let launchDaemon: CFStringRef = "com.example.ApplicationLauncher"
if SMLoginItemSetEnabled(launchDaemon, true) // Error appears here
{
// ...
}
错误似乎一直是:
类型“Boolean”不符合协议(protocol)“BooleanType”
我已经尝试在多个位置转换为 Bool
,以防我只是处理 redundant, archaic primitive。 (由 Obj-C 或 Core Foundation 引入),无济于事。
以防万一,我试过转换响应:
SMLoginItemSetEnabled(launchDaemon, true) 为 Bool
产生错误:
'Boolean' 不能转换为 'Bool'
……是认真的吗?
最佳答案
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
扩展允许自动转换Boolean
的第二个参数true
。BooleanType
扩展允许自动转换Boolean
将函数的值返回给 if 语句的Bool
。
更新:从 Swift 2/Xcode 7 beta 5 开始,“历史 Mac 类型” bool 值
被映射到 Swift 作为 Bool
,这使得上面的扩展方法
已过时。
关于objective-c - 类型 'Boolean' 不符合协议(protocol) 'BooleanType',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304158/