0

Swift 2.0 には 2 つのクラスの階層があります。どちらのクラスも、引数を渡すか、引数[String: AnyObject]を含む JSON 辞書 ( ) を渡すことでインスタンス化できます。

引数を直接受け取る initはでdesignated inits、JSON を受け取る init は同じ署名です。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"


    }

}

convenienceinitSubThingは super で同じ init を呼び出すことは許可されていません。自分自身で呼び出すと、両方のメソッドのように無限再帰が発生しますhave the same signature

両方の json inits を作成するとdesignated、 を呼び出すことができず、 の両方の初期化子で同じコードを繰り返さなければなりません。self.init(name:)ThingThing

このような状況を回避する最善の方法は何ですか?

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

テスト済みで動作しています。UPDATE : プライベート inits を追加したため、空に初期化できませんでした。

于 2015-08-06T15:03:05.330 に答える