objective-c - 类型 'Boolean' 不符合协议(protocol) 'BooleanType'

标签 objective-c xcode swift osx-yosemite

在尝试根据 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/

相关文章:

objective-c - 为什么从sharedInstance返回id

iphone - NavigationController背景图像问题

swift - 获取用户位置在 Xcode 中不起作用

xcode - swift - MacOs 应用程序 - 添加到 finder 上下文菜单?

ios - 使用 Twilio 的可编程聊天时出现 401 未经授权访问

ios - 尝试将数据从解析添加到 IOS 中的 NSMutableArray

iphone - 在 Objective C 中使用下划线作为属性名称前缀

ios - 在屏幕外绘制一个 uiview

swift - 如何用固定的开始到结束位置替换 panGestureDidMove

Swift - class 和 func 关键字