In Swift moeten alle eigenschappen van niet-optionele types zijn geïnitialiseerd voor het einde van de initialisatie van het exemplaar. Hiervoor worden initializers gebruikt: designated (basis), convenience (hulp) en required (verplicht voor afgeleiden).
Voorbeeld:
class Vehicle { let numberOfWheels: Int required init(numberOfWheels: Int) { self.numberOfWheels = numberOfWheels } } class Car: Vehicle { let brand: String // Designated initializer required init(numberOfWheels: Int) { self.brand = "Unknown" super.init(numberOfWheels: numberOfWheels) } // Convenience convenience init() { self.init(numberOfWheels: 4) self.brand = "Ford" } }
Kernfeatures:
In welke volgorde moeten de eigenschappen van een afgeleide klasse en de superclass worden geïnitialiseerd bij het gebruik van een designated initializer?
Antwoord: Alle eigenschappen van de afgeleide klasse moeten zijn geïnitialiseerd voordat de designated initializer van de superclass (super.init) wordt aangeroepen, anders zal dit een compilatiefout opleveren. Na super.init kunnen nieuwe opgeslagen eigenschappen van de afgeleide klasse niet meer worden geïnitialiseerd, alleen worden gebruikt.
class Parent { let parentProp: Int init(prop: Int) { parentProp = prop } } class Child: Parent { let childProp: String init(prop: Int, childProp: String) { self.childProp = childProp // Eerst eigen eigenschappen super.init(prop: prop) // Dan parent } }
Verhaal
Een ontwikkelaar probeerde in een convenience initializer rechtstreeks een waarde toe te wijzen aan een vereiste eigenschap zonder de designated aan te roepen. Dit resulteerde in het twee keer initialiseren van de eigenschap met verschillende waarden, wat leidde tot onverwacht gedrag tijdens het testen.
Verhaal
Bij het erven van een diepe klassenhiërarchie vergaten ze de vereiste init te declareren, wat leidde tot de onmogelijkheid om het afgeleide type correct te initialiseren uit een framework via reflectie, en een crash bij het deserialiseren van een JSON-model.
Verhaal
In de applicatie werd de designated initializer van de superclass niet aangeroepen tijdens het uitbreiden van de Vehicle-klasse, wat leidde tot een incorrecte initialisatie van verplichte eigenschappen en een runtime crash in productie na de gegevensschema-update.