Swift 类层次结构中的便利初始化导致无限递归
在Swift 2.0中,我有两个类的层次结构。这两个类都可以通过传递参数或传递包含参数的JSON字典(Swift 类层次结构中的便利初始化导致无限递归,swift,initialization,swift2,designated-initializer,Swift,Initialization,Swift2,Designated Initializer,在Swift 2.0中,我有两个类的层次结构。这两个类都可以通过传递参数或传递包含参数的JSON字典([String:AnyObject])来实例化 直接接受参数的init是指定init,而接受JSON的init是便利init,具有相同的签名 class Thing { let name : String init(name: String){ self.name = name } convenience init(jsonNamed: Str
[String:AnyObject]
)来实例化
直接接受参数的init是指定init
,而接受JSON的init是便利init
,具有相同的签名
class Thing {
let name : String
init(name: String){
self.name = name
}
convenience init(jsonNamed: String){
// read the json, parse and extract
// the name
self.init(name: "got this from JSON")
}
}
class SubThing : Thing{
var surname : String
init(name: String, surname: String){
self.surname = surname
super.init(name: name)
}
convenience init(jsonNamed: String){
self.init(jsonNamed: "got this from JSON")
// extract surname
self.surname = "Got this from json"
}
}
子项中的便利性
init不允许在super中调用相同的init,如果我在self中调用它,它将导致无限递归,因为两个方法具有相同的签名
如果我将两个json init都指定为
一个,我就不能在Thing
中调用self.init(name:)
,我必须在Thing
中的两个初始化器中重复相同的代码
避免这种情况的最佳方法是什么?您正在子项中执行循环,从自身调用相同的指定初始值设定项。我看到它是这样改写的:
class Thing {
private var name : String?
private init() {}
convenience init(name: String){
self.init()
self.name = name
}
convenience init(jsonNamed: String){
self.init()
self.name = getNameFromJSON()
}
private func getNameFromJSON() -> String {
// read the json, parse and extract
// the name
return "got this from JSON"
}
}
class SubThing : Thing {
private var surname : String?
convenience init(name: String, surname: String){
self.init(name: name)
self.surname = surname
}
convenience init(jsonNamed: String){
self.init()
self.name = getNameFromJSON()
// extract surname
self.surname = "Got this from json"
}
}
测试和工作更新:添加了私有init,因此无法将其初始化为空。我决定将所有json解析从init中移出,并放入一个函数中,该函数返回一个包含所有正确类型信息的结构,类似于Haskell所做的。你的回答让我找到了正确的方向,谢谢!:-)