[英]Why does Swift give me a compiler error when my convenience initializer runs self.init inside if an if-let statement?
這是我想要編譯的代碼示例:
class Fruit {
var name: String
init(name: String, season: String) {
self.name = name
}
convenience init?(data: [String: String]) {
if let name = data["name"], region = data["region"] {
self.init(name: name, season: region)
}
}
}
編譯器錯誤是“在調用self.init之前委托初始化程序時使用'self'”
如果初始化程序是可用的,我不應該有能夠運行任何初始化程序的代碼路徑嗎? 如果您使用初始化程序添加else,則此代碼將編譯:
convenience init?(data: [String: String]) {
if let name = data["name"], region = data["region"] {
self.init(name: name, season: region)
} else {
self.init(name: "test", season: "test")
}
}
錯誤消息可能會產生誤導。 如果初始化失敗,則必須顯式返回nil
,如文檔“Failable Initializers”中所述 :
您在可用的初始值設定項中寫入
return nil
,以指示可以觸發初始化失敗的點。
在您的情況下,如果可選綁定失敗,則必須添加else案例:
convenience init?(data: [String: String]) {
if let name = data["name"], region = data["region"] {
self.init(name: name, season: region)
} else {
return nil
}
}
另外還有guard
:
convenience init?(data: [String: String]) {
guard let name = data["name"], region = data["region"] else {
return nil
}
self.init(name: name, season: region)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.