Sobes.tech
Junior — Middle

Je možné volať metódu super v konštruktore convenience initializer v Swift?

sobes.tech AI

Odpoveď od AI

V Swiftu nie je možné priamo volať super.init v konštruktore convenience initializer. Podľa pravidiel inicializácie v Swiftu musia convenience inicializátory volať iný inicializátor rovnakej triedy, nie inicializátor nadtriedy.

Iba designated initializer (hlavný inicializátor) môže volať super.init. Preto musí convenience inicializátor najskôr volať designated inicializátor svojej triedy, ktorý následne zavolá super.init.

Príklad:

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

class Child: Parent {
    override init() {
        super.init() // volanie nadtriedy v designated inicializátore
        print("Child designated init")
    }

    convenience init(param: Int) {
        self.init() // volanie designated inicializátora svojej triedy
        print("Child convenience init s parametrom \(param)")
    }
}

let c = Child(param: 5)

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