以下是我想要编译的代码示例:
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")
}
}
答案 0 :(得分:1)
错误消息可能会产生误导。如果初始化失败,则必须显式返回nil
,如中所述
文档"Failable Initializers":
您在可用的初始化程序中编写
return nil
以指示一个点 可以触发初始化失败。
在您的情况下,您必须添加其他案例 如果可选绑定失败:
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)
}