簡體   English   中英

類型'Boolean'不符合協議'BooleanType'

[英]Type 'Boolean' does not conform to protocol 'BooleanType'

在嘗試根據Apple文檔(和教程化 )創建啟動助手時,我似乎遇到了將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引入),但無濟於事。

為了以防萬一,我嘗試了回復:

SMLoginItemSetEnabled(launchDaemon, true) as Bool

產生錯誤:

'Boolean' is not convertible to '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擴展允許將第二個參數true自動轉換為Boolean
  • BooleanType擴展允許的自動轉換Boolean函數的返回值Bool的if語句。

更新:Swift 2 / Xcode 7 beta 5開始, “歷史Mac類型” Boolean被映射到Swift作為Bool ,這使得上述擴展方法過時了。

是的,我有一個類似的問題試圖在Swift中獲得BOOL返回Objective-C方法。

OBJ-C:

- (BOOL)isLogging
{
    return isLogging;
}

迅速:

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

這是我擺脫錯誤的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM