Başarısız başlatıcılar (init?) Swift'te bir türün bir örneğinin yaratılmasının başarısız olabileceği durumu tanımlamak için kullanılır ve nil döndürebilirler. Genellikle giriş verilerini doğrulamak veya başarısız olabilecek dönüşümler için kullanılırlar. Başarısız bir başlatıcıda, nesnenin başarısız bir şekilde yaratıldığını belirtmek için açıkça nil dönebilirsiniz.
Örnek:
struct User { let name: String let age: Int init?(name: String, age: Int) { guard !name.isEmpty, age > 0 else { return nil } self.name = name self.age = age } } }
Bu şekilde geçersiz nesnelerin yaratılmasını önlemeye yardımcı olabilirsiniz.
compactMap) işlemi yaparken, geçersiz nesnelerin filtrelenmesi için uygundur.Soru: init? ile init! arasındaki fark nedir ve hangi durumlarda iptalsiz açılanabilir başarısız başlatıcı kullanmalısınız?
Cevap: init? bir opsiyonel (<type?>) döner ve eğer başlatma başarısız olursa nil döner, bu da güvenli bir işlem gerektirir. init! ise açılanabilir opsiyonel (<type!>) döner ve eğer başlatma başarısız olursa yine nil döner, ancak bu nesneyi kontrol etmeden kullanmak runtime çökmesine yol açar. init! yalnızca başlatmanın sizin bağlamınızda asla başarısız olamayacağından kesinlikle eminseniz kullanılmalıdır (örneğin, UIKit ile çalışma sırasında storyboard kullanırken).
let value = Int("abc") // value nil olacak
Hikaye
JSON'u elle ayrıştırırken, normal bir başlatıcı yerine başarısız bir başlatıcı kullandık. Bu, geçersiz kullanıcıların yaratılmasına sebep oldu, çünkü doğrulama çalışmadı ve uygulama geçersiz verileri filtrelemedi.
Hikaye
Potansiyel olarak geçersiz verilerle
init!kullanmak, API güncellemesinden sonra uygulamanın çökmesine neden oldu: giriş verilerinin formatı değişti ve objeyi çıkartırken runtime hatası oluştu çünkü nil açılmıştı.
Hikaye
Bazı senaryolar için açıkça nil döndürmeyi unuttuk ve sonuç olarak yapı "kirlilik" alanlarıyla başlatıldı, bu daha sonra iş mantığında hatalara yol açtı.