ProgramlamaiOS geliştirici

Swift'te başarısız başlatıcılar (`init?`) nasıl çalışır? Ne zaman ve neden kullanılmalıdır, dikkate alınması gereken önemli noktalar nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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.

Önemli noktalar:

  • Miras zincirinde başarısız başlatıcılar yalnızca başarısız başlatıcılarla geçersiz kılınabilir.
  • Başarısız başlatıcıya sahip bir yapıyı bir dizi içinde kullanırken, başlatma haritalama (compactMap) işlemi yaparken, geçersiz nesnelerin filtrelenmesi için uygundur.

Tuzak Sorusu

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

Konunun inceliklerinden habersiz olmanın gerçek hata örnekleri.


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ı.