[英]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.