Sobes.tech
Junior — Middle

Είναι δυνατόν να καλέσετε τη μέθοδο super στον κατασκευαστή convenience initializer στο Swift;

sobes.tech AI

Απάντηση από AI

Στη Swift, η κλήση super.init στον constructor convenience initializer δεν είναι δυνατή άμεσα. Σύμφωνα με τους κανόνες αρχικοποίησης στη Swift, οι convenience αρχικοποιητές πρέπει να καλούν έναν άλλο αρχικοποιητή της ίδιας κλάσης, όχι του υπερκλάσης.

Μόνο ο designated initializer (ο κύριος αρχικοποιητής) μπορεί να καλέσει super.init. Επομένως, ο convenience αρχικοποιητής πρέπει πρώτα να καλέσει τον designated initializer της δικής του κλάσης, ο οποίος με τη σειρά του θα καλέσει super.init.

Παράδειγμα:

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

class Child: Parent {
    override init() {
        super.init() // κλήση της υπερκλάσης στον designated initializer
        print("Child designated init")
    }

    convenience init(param: Int) {
        self.init() // κλήση του designated initializer της δικής του κλάσης
        print("Child convenience init με παράμετρο \(param)")
    }
}

let c = Child(param: 5)

Εδώ, ο convenience init καλεί self.init(), και self.init() καλεί super.init().