ProgrammationDéveloppeur iOS

Qu'est-ce que les key-paths en Swift ? Comment utiliser WritableKeyPath et pourquoi sont-ils nécessaires, quels problèmes résolvent-ils, quelles pièges existent-ils lors de l'utilisation de l'API KeyPath ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Utilisé pour travailler de manière générique avec des modèles (par exemple, lors de la tri, du filtrage, de la liaison des données à l'UI).
  • Pratique pour construire une réflexion conviviale sans perte de sécurité de type.

Subtilités :

  • KeyPath uniquement pour les propriétés accessibles par le compilateur.
  • KeyPath ne peut pas stocker des méthodes, uniquement des propriétés.
  • Pour WritableKeyPath, l'objet (structure) doit être var.

Question piège.

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

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


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.