Soru tarihi:
Optional chaining, Swift'te iç içe geçmiş optionallarla çalışmak için kullanışlılık sağlamak amacıyla ortaya çıktı, böylece sonsuz nil kontrolleri olmadan kompakt ve güvenli kod yazmamıza olanak tanır. Bu, mevcut olmayabilecek nesnelerin özelliklerine ve yöntemlerine erişirken özellikle faydalıdır.
Sorun:
Optional chaining ile çalışırken, zincirdeki nesnelerden biri nil ise hangi sonucun elde edileceğini yanlış anlamak kolaydır veya dönen değeri yanlış işleyebilirseniz, çalışma zamanı hataları veya beklenmedik davranışlarla karşılaşabilirsiniz.
Çözüm:
Optional chaining, nil olabilecek nesnelerin iç içe geçmiş özelliklerine, yöntemlerine ve subscript'lerine güvenli bir şekilde erişmemizi sağlayan bir mekanizmadır. Zincirdeki herhangi bir öğe nil ise, tüm yapı nil döner ve hata oluşturmaz.
Kod örneği:
class Address { var city: String? } class User { var address: Address? } let user: User? = User() user?.address?.city = "Moskova" if let city = user?.address?.city { print(city) } else { print("Şehir bulunamadı") }
Ana özellikler:
Optional chaining ile bir yöntem çağırma veya özellik elde etme girişimi nil olan bir nesne ile çalışma zamanı hatası oluşturur mu?
Hayır, çalışma zamanı hatası oluşmaz. Optional chaining ile ifade nil döner, yürütme hata olmadan kesilir.
Kod örneği:
let email: String? = nil let lowercased = email?.lowercased() // lowercased nil olacak, hata oluşmayacak
Ara nesne yoksa optional chaining ile atama gerçekleştirilecek mi?
Hayır, eğer nesne veya ara özellik nil ise, atama hiçbir şekilde kendini göstermez ve belleği değiştirmez.
Kod örneği:
var user: User? = nil user?.address?.city = "Kazan" // hiçbir şey olmayacak, user nil
Optional chaining'in sonucu optional olabilir mi?
Hayır, optional chaining ile yapılan her ifadenin sonucu her zaman optional'dır, başlangıç özelliği optional olmasa bile.
Kod örneği:
class Test { var number: Int = 10 } let t: Test? = nil let value = t?.number // value: Int? (optional)
Kod, user?.address?.city'e ulaşır ve şehir olup olmadığını kontrol etmeden city! ile çıkarımda bulunur. Eğer zincirden bir bağlantı nil ise çökme olur.
Artılar:
Eksiler:
Kod, user?.address?.city için if let veya guard let ile kontrol yapar ve sadece ardından değeri işler.
Artılar:
Eksiler: