Le key-path (chemin clé) est un mécanisme d'accès sécurisé aux propriétés des objets "par référence". Ils offrent un accès complet et type-safe aux propriétés :
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 — permet non seulement de lire, mais aussi de modifier des propriétés :
var person = Person(name: "Foo", age: 22) let namePath: WritableKeyPath<Person, String> = \Person.name person[keyPath: namePath] = "Bar"
Utilisation :
Subtilités :
WritableKeyPath, l'objet (structure) doit être var.Question: "Peut-on modifier les propriétés d'une classe via un KeyPath normal (ou un WritableKeyPath est-il nécessaire) ? Quelles sont les différences entre KeyPath et ReferenceWritableKeyPath ?"
Réponse : Pour modifier la valeur d'une propriété par le biais d'un key path, un WritableKeyPath est nécessaire. Pour les classes, il existe également ReferenceWritableKeyPath, qui permet de modifier les propriétés par key-path pour les types de référence.
class User { var score = 0 } let user = User() let path: ReferenceWritableKeyPath<User, Int> = \User.score user[keyPath: path] = 42 // OK
Histoire
Dans un grand projet de UI basé sur des tables, ils ont confondu les KeyPath normaux et WritableKeyPath — ils ont essayé de modifier une propriété modèle via KeyPath, ce qui a entraîné une exception d'exécution.
Histoire
Lors de la génération de formulaires génériques, des KeyPath ont été utilisés pour lier des valeurs, mais ils ont tenté de réfléchir des méthodes comme des keypaths, ce qui a conduit à des impossibilités de compilation et à une complexité accrue du code.
Histoire
Le développeur oubliait d'ajouter ReferenceWritableKeyPath pour les classes, ce qui compliquait la liaison bidirectionnelle entre l'UI et le modèle de données : les valeurs se mettaient à jour dans l'UI, mais le modèle restait le même.