Sobes.tech
Junior — Middle

Je možné zavolat metodu super v konstruktoru convenience initializer v Swiftu?

sobes.tech AI

Odpověď od AI

V Swiftu není přímý volání super.init v konstruktoru convenience initializer. Podle pravidel inicializace ve Swiftu musí convenience inicializátory volat jiný inicializátor téže třídy, nikoliv inicializátor nadtřídy.

Pouze designated inicializátor (hlavní inicializátor) může volat super.init. Proto musí convenience inicializátor nejprve zavolat designated inicializátor své třídy, který pak zavolá super.init.

Příklad:

class Parent {
    init() {
        print("Parent init")
    }
}

class Child: Parent {
    override init() {
        super.init() // volání nadtřídy v designated inicializátoru
        print("Child designated init")
    }

    convenience init(param: Int) {
        self.init() // volání designated inicializátoru své třídy
        print("Child convenience init s parametrem \(param)")
    }
}

let c = Child(param: 5)

Zde convenience init volá self.init(), a self.init() volá super.init().