ProgramlamaiOS geliştirici

Swift'te key-paths nedir? WritableKeyPath nasıl kullanılır ve ne için gereklidir, hangi sorunları çözer, KeyPath API ile çalışırken hangi tuzaklar vardır?

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

Cevap.

Key-path (anahtar yolu) — nesnelerin özelliklerine "referansla" erişimi güvenli bir şekilde sağlamak için kullanılan bir mekanizmadır. Özelliklere erişim için tam bir tip güvenliği sağlar:

struct Person { var name: String var age: Int } let kp = \Person.name let john = Person(name: "John", age: 30) print(john[keyPath: kp]) // "John"

WritableKeyPath — sadece okumakla kalmayıp, özellikleri değiştirmeye de imkan verir:

var person = Person(name: "Foo", age: 22) let namePath: WritableKeyPath<Person, String> = \Person.name person[keyPath: namePath] = "Bar"

Kullanım:

  • Modellerle genel bir çalışma için kullanılır (örneğin, sıralama, filtreleme, verilere UI bağlama gibi).
  • Kullanıcı dostu yansıma (reflection) oluşturmak için, tip güvenliğinden ödün vermeden uygundur.

İncelikler:

  • KeyPath yalnızca derleyici erişiminin mümkün olduğu özellikler için geçerlidir.
  • KeyPath yöntemleri saklayamaz, yalnızca özellikleri saklar.
  • WritableKeyPath için, nesne (yapı) değişken (var) olmalıdır.

Kandırmaca Sorusu.

Soru: "Sıradan bir KeyPath aracılığıyla sınıf özelliklerini değiştirebilir miyiz (yoksa WritableKeyPath mı gerektirir)? KeyPath ve ReferenceWritableKeyPath arasındaki farklar nelerdir?"

Cevap: Key path üzerinden bir özelliğin değerini değiştirmek için WritableKeyPath gereklidir. Sınıflar için ayrıca, referans tipler için key-path ile özellikleri değiştirmeye olanak tanıyan ReferenceWritableKeyPath da bulunmaktadır.

class User { var score = 0 } let user = User() let path: ReferenceWritableKeyPath<User, Int> = \User.score user[keyPath: path] = 42 // TAMAM

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


Hikaye

Büyük bir projede, tablo odaklı UI'da sıradan KeyPath ve WritableKeyPath karıştırıldı — bir modelin özelliğini KeyPath aracılığıyla değiştirmeye çalıştılar ve runtime hatası aldılar.


Hikaye

Generic formların oluşturulmasında, değerlerin bağlanması için KeyPath kullanıldı, ancak metotları keypath olarak yansıtmaya çalıştılar, bu da derleme hatasına ve kodun aşırı karmaşıklaşmasına yol açtı.


Hikaye

Geliştirici, sınıflar için ReferenceWritableKeyPath eklemeyi unuttu, bu da UI ile veri modeli arasında iki yönlü bağlanmayı engelledi: değerler UI'de güncellenirken, model sabit kaldı.