Swift 类层次结构中的便利初始化导致无限递归

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

在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: 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所做的。你的回答让我找到了正确的方向,谢谢!:-)