Wat is het verschil tussen convention en designated initializers in Swift?
sobes.tech AI
Antwoord van AI
-
Aangewezen Initializer: De hoofd-, "basis"-initializer in de klasse. Hij moet alle eigen opgeslagen eigenschappen volledig initialiseren, en vervolgens de aangewezen initializer van de superklasse aanroepen (via
super.init). Elke klasse moet minstens één aangewezen initializer hebben. -
Convenience Initializer: Een hulpfunctie- initializer bedoeld om het maken van instanties van de klasse in bepaalde scenario's te vereenvoudigen. Het moet een andere initializer van dezelfde klasse aanroepen — of een aangewezen of een convenience initializer. Uiteindelijk moet de keten van convenience initializers leiden tot de aanroep van de aangewezen initializer in dezelfde klasse. Convenience initializers zijn optioneel.
Hier is het delegatieschema voor initialisatie:
Convenience -> Aangewezen (in dezelfde klasse)
Aangewezen -> Aangewezen (in de ouderklasse)
Voorbeeld:
class MyClass {
var value: Int
var name: String
// Aangewezen initializer
init(value: Int, name: String) {
self.value = value
self.name = name
}
// Convenience initializer
convenience init(value: Int) {
self.init(value: value, name: "DefaultName") // Roept de aangewezen initializer in dezelfde klasse aan
}
// Andere convenience initializer
convenience init(name: String) {
self.init(value: 0, name: name) // Roept de aangewezen initializer in dezelfde klasse aan
}
}
let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")
Het belangrijkste verschil ligt in hun rol in de initialisatieketen en de delegatieregels: de aangewezen initializer garandeert de volledige initialisatie van zijn eigenschappen en delegeert de initialisatie naar de ouder, terwijl de convenience initializer het maken van instanties vereenvoudigt door te delegëren naar een andere initializer in dezelfde klasse, die uiteindelijk de aangewezen initializer aanroept.