【问题标题】:Type 'Boolean' does not conform to protocol 'BooleanType'类型“Boolean”不符合协议“BooleanType”
【发布时间】:2016-05-18 18:04:04
【问题描述】:

在尝试按照 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'

...认真的吗?

【问题讨论】:

  • 亲爱的 Chris,你能添加我的 Skype:contact@giauhuynh.com 并帮助我实现 SMLoginItemSetEnabled。我现在在线。非常感谢。

标签: objective-c xcode swift osx-yosemite


【解决方案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 起,“历史悠久的 Mac 类型”Boolean 映射到 Swift 为Bool,这使得上面的扩展方法 过时了。

【讨论】:

  • 嘿,我喜欢Boolean(1)——让你更容易理解你的称呼。 :)
  • 我可以发誓我尝试过这个组合......不过它有效!谢谢!
【解决方案2】:

是的,我在 Swift 中尝试获取 Objective-C 方法的 BOOL 返回时遇到了类似的问题。

对象-C:

- (BOOL)isLogging
{
    return isLogging;
}

斯威夫特:

    if (self.isLogging().boolValue)
    {
        ...
    }

这就是我摆脱错误的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多