尝试按照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引入)而无济于事。
Bool
为了以防万一,我尝试投射响应:
SMLoginItemSetEnabled(launchDaemon, true) as Bool
产生错误:
'Boolean' is not convertible to 'Bool'
…严重吗?
Boolean 是“历史Mac类型”,并声明为
Boolean
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
true
BooleanType
更新: 从 Swift 2 / Xcode 7 beta 5开始, “ historic Mac type” Boolean 被映射为Swift Bool,使得上述扩展方法已过时。