Initializer Delegation, Swift'te sınıflar için yerleşik bir başlatma delegasyonu sistemidir. Swift'te tarihsel olarak designated initializer (sınıfın tüm özelliklerini tam olarak başlatmaktan sorumlu olan ana başlatıcı) ve convenience initializer (farklı parametre setleriyle örnek oluşturmayı kolaylaştıran yardımcı başlatıcı) arasında bir ayrım vardır.
Sorun: Eğer sınıflar ve onların mirasçıları arasında başlatıcıların kaotik bir şekilde çalışmasına izin verilirse, temel sınıf tam olarak başlatılmadığı veya başlatma işleminin birden fazla kez gerçekleştiği durumlarla karşılaşmak mümkündür ki bu da geçersiz bir nesne ile sonuçlanır.
Çözüm — katı bir kural:
Kod örneği:
class Vehicle { var wheels: Int // Designated başlatıcı init(wheels: Int) { self.wheels = wheels } // Convenience başlatıcı convenience init() { self.init(wheels: 4) } } class Car: Vehicle { var color: String // Designated başlatıcı init(wheels: Int, color: String) { self.color = color super.init(wheels: wheels) } // Convenience başlatıcı convenience init(color: String) { self.init(wheels: 4, color: color) } }
Anahtar özellikler:
Soru 1: Convenience başlatıcı üst sınıfın başlatıcısını doğrudan super.init ile çağırabilir mi?
Hayır, convenience başlatıcı her zaman mevcut sınıftaki başka bir başlatıcıya (designated veya başka bir convenience) başvurur, bu başlatıcı daha sonra üst sınıfın designated başlatıcısını çağırabilir.
Soru 2: Eğer bir alt sınıfta required başlatıcı uygulanmazsa ne olur?
Eğer üst sınıfın required başlatıcısı varsa, bu her alt sınıfta (required kullanarak) geçersiz kılınmalıdır, aksi takdirde derleyici hata verecektir.
Soru 3: convenience init ile convenience required init arasındaki fark nedir?
convenience required init belirli bir convenience başlatıcısının üst sınıfta required olarak tanımlandığı durumlarda gereklidir, bu sayede miras hiyerarşisinde başlatmayı destekler.
Geliştirici convenience başlatıcısından super.init'i çağırdı. Kod yalnızca belirli kısıtlamaların olmaması sayesinde derlendi, ancak çalıştırma anında hata meydana geldi: nesnenin tüm özellikleri başlatılmamıştı.
Artıları:
Eksileri:
Belirgin bir yapılandırılmış designated ve convenience başlatıcılarının net çağrıları kullanıldı. Mantık, Swift kurallarına sıkı sıkıya bağlı şekilde çağrıldı, bu nedenle başlatma her zaman şeffaf ve doğru oldu.
Artıları:
Eksileri: