Swift'te tüm optional olmayan türdeki özellikler, bir nesnenin başlatılması sona ermeden önce başlatılmalıdır. Bunun için üç tür başlatıcı kullanılır: designated (temel), convenience (yardımcı) ve required (miras alanlar için zorunlu).
Örnek:
class Vehicle { let numberOfWheels: Int required init(numberOfWheels: Int) { self.numberOfWheels = numberOfWheels } } class Car: Vehicle { let brand: String // Designated başlatıcı required init(numberOfWheels: Int) { self.brand = "Unknown" super.init(numberOfWheels: numberOfWheels) } // Convenience convenience init() { self.init(numberOfWheels: 4) self.brand = "Ford" } }
Anahtar özellikler:
Designated başlatıcısını kullanırken alt sınıf ve üst sınıf özelliklerini hangi sırayla başlatmak gerekir?
Cevap: Alt sınıfın tüm özellikleri super.init çağrısından önce başlatılmalıdır, aksi takdirde bir derleme hatası oluşur. Super.init'den sonra alt sınıfın yeni stored özelliklerini başlatmak mümkün değildir, yalnızca kullanmaları gerekir.
class Parent { let parentProp: Int init(prop: Int) { parentProp = prop } } class Child: Parent { let childProp: String init(prop: Int, childProp: String) { self.childProp = childProp // Önce kendi özelliklerim super.init(prop: prop) // Sonra parent } }
Hikaye
Bir geliştirici convenience başlatıcısında doğrudan required özelliğe değer atamaya çalıştı, designated'i çağırmadan. Sonuç olarak, özellik iki farklı değerle başlatıldı ve test aşamasında beklenmedik davranışa yol açtı.
Hikaye
Derin sınıf hiyerarşisi miras alırken required init bildirememek, çerçeve üzerinden türetilen tipin düzgün başlatılamamasına ve JSON modelinin serileştirildiğinde çökmesine neden oldu.
Hikaye
Vehicle sınıfında genişletme sırasında üst sınıfın designated başlatıcısı çağırılmadı, bu zorunlu özelliklerin düzgün başlatılmamasına ve üretimde veri şemasının güncellenmesinden sonra runtime çökmesine yol açtı.