ProgramlamaiOS/Swift geliştirici

Swift'te optional chaining ile çalışmanın özellikleri nelerdir, değer zincirlerini nasıl işleyebiliriz ve hangi durumlarda çalışma zamanı hatalarına neden olur?

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

Cevap.

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:

  • Zincir boyunca, ortada bir değer nil olsa bile özelliklere ve yöntemlere erişim sağlar.
  • Dönen değer her zaman optional olacaktır, hedef özelliğin türünden bağımsız olarak.
  • Yöntem çağırma, subscript ve hatta atama için kullanılabilir, ancak işlenmemiş nil'lere dikkat edilmelidir.

Şaşırtıcı sorular.

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)

Tipik hatalar ve anti-deseni

  • Optional sonucu göz ardı etmek ve onunla non-optional gibi çalışmak — derleyici hatalarına veya mantık ihlallerine yol açar.
  • Optional chaining'den sonra force unwrap yapmaya çalışmak.
  • Zincir çok uzun ve karmaşık; okunması ve hata ayıklaması zor.

Hayatın örneği

Negatif durum

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:

  • Kısa kod

Eksiler:

  • Çalışma zamanında çökme şansı yüksek
  • Okunması zor

Pozitif durum

Kod, user?.address?.city için if let veya guard let ile kontrol yapar ve sadece ardından değeri işler.

Artılar:

  • Güvenlik garantisi
  • Daha anlaşılır mantık

Eksiler:

  • Daha fazla kod (ama güvenli)