Il key-path (percorso chiave) è un meccanismo per accedere in modo sicuro alle proprietà degli oggetti "per riferimento". Forniscono un accesso completamente type-safe alle proprietà:
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 — consente di non solo leggere, ma anche modificare le proprietà:
var person = Person(name: "Foo", age: 22) let namePath: WritableKeyPath<Person, String> = \Person.name person[keyPath: namePath] = "Bar"
Utilizzo:
Dettagli:
WritableKeyPath l'oggetto (struttura) deve essere var.Domanda: "Si possono modificare le proprietà di una classe tramite un normale KeyPath (o è necessario WritableKeyPath)? In cosa si differenziano KeyPath e ReferenceWritableKeyPath?"
Risposta: Per modificare il valore di una proprietà tramite key path è necessario WritableKeyPath. Per le classi esiste anche ReferenceWritableKeyPath, che consente di modificare le proprietà tramite key-path per i tipi di riferimento.
class User { var score = 0 } let user = User() let path: ReferenceWritableKeyPath<User, Int> = \User.score user[keyPath: path] = 42 // OK
Storia
In un grande progetto UI basato su table-driven, sono stati confusi KeyPath normali e WritableKeyPath — hanno cercato di modificare una proprietà del modello tramite KeyPath, causando un'eccezione runtime.
Storia
Durante la generazione di forme generiche, sono stati utilizzati KeyPath per il binding dei valori, ma hanno cercato di riflettere metodi come keypaths, il che ha portato a impossibilità di compilazione e complicazione del codice.
Storia
Uno sviluppatore dimenticava di aggiungere ReferenceWritableKeyPath per le classi, il che impediva il binding bidirezionale tra l'interfaccia utente e il modello di dati: i valori venivano aggiornati nell'UI, ma il modello rimaneva invariato.