Mi a különbség a convention és a designated inicializátorok között Swiftben?
sobes.tech MI
Válasz az MI-től
-
Megállapított Inicializáló: A fő, „alap” inicializáló az osztályban. Teljes mértékben inicializálnia kell az osztály saját tárolt tulajdonságait, majd meghívnia a szülőosztály megállapított inicializálóját (
super.init) a hierarchiában. Minden osztálynak legalább egy megállapított inicializálóval kell rendelkeznie. -
Kényelmi Inicializáló: Egy segéd inicializáló, amely megkönnyíti az osztály példányainak létrehozását bizonyos forgatókönyvekben. Kötelező másik inicializálót hívnia ugyanabból az osztályból — akár megállapított, akár kényelmi. Végső soron a kényelmi inicializálók láncolata a megállapított inicializáló hívásához kell, hogy vezessen ugyanabban az osztályban. A kényelmi inicializálók opcionálisak.
Íme az inicializálás delegálási sémája:
Convenience -> Megállapított (ugyanabban az osztályban)
Megállapított -> Megállapított (a szülőosztályban)
Példa:
class MyClass {
var value: Int
var name: String
// Megállapított inicializáló
init(value: Int, name: String) {
self.value = value
self.name = name
}
// Kényelmi inicializáló
convenience init(value: Int) {
self.init(value: value, name: "DefaultName") // Meghívja a megállapított inicializálót ugyanabban az osztályban
}
// Más kényelmi inicializáló
convenience init(name: String) {
self.init(value: 0, name: name) // Meghívja a megállapított inicializálót ugyanabban az osztályban
}
}
let instance1 = MyClass(value: 10, name: "Custom")
let instance2 = MyClass(value: 5)
let instance3 = MyClass(name: "Another")
A fő különbség az, hogy szerepük az inicializálási láncban és a delegálási szabályokban rejlik: a megállapított inicializáló garantálja a saját tulajdonságainak teljes inicializálását és delegálja az inicializálást a szülőosztálynak, míg a kényelmi inicializáló egyszerűsíti az példányok létrehozását más inicializálóra delegálva ugyanabban az osztályban, amely végül meghívja a megállapított inicializálót.