0

我在 Swift 2.0 中有 2 个类的层次结构。这两个类都可以通过传递参数或传递[String: AnyObject]包含参数的 JSON 字典 ( ) 来实例化。

直接采用参数的 inits 是designated inits,而采用 JSON 的 initsconvenience 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"


    }

}

convenienceinit inSubThing不允许在 super 中调用同一个 init,如果我在 self 中调用,会导致无限递归,因为这两个方法have the same signature

如果我让两个 json 初始化designated,我不能调用self.init(name:)in Thing,我将不得不在两个初始化器中重复相同的代码Thing

解决这种情况的最佳方法是什么?

4

1 回答 1

2

您正在循环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"
    }
}

测试和工作。更新:添加了私有初始化,因此它不能初始化为空。

于 2015-08-06T15:03:05.330 回答