Sobes.tech
Junior — Middle

Lehetséges a super metódus hívása a convenience initializer konstruktorában Swift-ben?

sobes.tech MI

Válasz az MI-től

Swiftben a super.init hívása a convenience initializer konstruktorban nem közvetlenül lehetséges. A Swift inicializálási szabályai szerint a convenience inicializálóknak egy másik azonos osztálybeli inicializálót kell hívniuk, nem a szülőosztályit.

Csak a designated initializer (fő inicializáló) hívhatja a super.init-et. Ezért a convenience inicializálónak először a saját osztályának designated inicializálóját kell hívnia, amely aztán meghívja a super.init-et.

Példa:

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

class Child: Parent {
    override init() {
        super.init() // a szülőhívás a designated inicializálóban
        print("Child designated init")
    }

    convenience init(param: Int) {
        self.init() // a saját osztályának designated inicializálójának hívása
        print("Child convenience init param értékkel \(param)")
    }
}

let c = Child(param: 5)

Ebben az esetben a convenience init meghívja a self.init(), ami pedig meghívja a super.init()-et.