class 层次结构中的便利初始化导致无限递归
Convenience inits in class hierarchy cause infinite recursion
我在 Swift 2.0 中有一个层次结构 2 类。 类 都可以通过传递参数或传递包含参数的 JSON 字典 ([String: AnyObject]
) 来实例化。
直接接受参数的init是designated inits
,而接受JSON的是convenience inits
,相同的签名。
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"
}
}
SubThing
中的convenience
init是不允许在super中调用同一个init的,如果我在self中调用,会导致无限递归,因为这两种方法have the same signature
.
如果我同时进行 json inits designated
初始化,我将无法在 Thing
中调用 self.init(name:)
,并且我将不得不在两者中重复相同的代码Thing
.
中的初始化程序
解决这种情况的最佳方法是什么?
您正在 SubThing
中进行循环,从自身调用相同的指定初始化程序。我看到它是这样重写的:
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"
}
}
已测试并正常工作。 更新: 添加了私有初始化,因此不能初始化为空。
我在 Swift 2.0 中有一个层次结构 2 类。 类 都可以通过传递参数或传递包含参数的 JSON 字典 ([String: AnyObject]
) 来实例化。
直接接受参数的init是designated inits
,而接受JSON的是convenience inits
,相同的签名。
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"
}
}
SubThing
中的convenience
init是不允许在super中调用同一个init的,如果我在self中调用,会导致无限递归,因为这两种方法have the same signature
.
如果我同时进行 json inits designated
初始化,我将无法在 Thing
中调用 self.init(name:)
,并且我将不得不在两者中重复相同的代码Thing
.
解决这种情况的最佳方法是什么?
您正在 SubThing
中进行循环,从自身调用相同的指定初始化程序。我看到它是这样重写的:
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"
}
}
已测试并正常工作。 更新: 添加了私有初始化,因此不能初始化为空。