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"
    }
}

已测试并正常工作。 更新: 添加了私有初始化,因此不能初始化为空。