在尝试按照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'
...严重?
答案 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
扩展程序允许自动转换
第二个参数true
到Boolean
。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)
{
...
}
这是我摆脱错误的方式。