ProgrammazioneSviluppatore iOS

Che cos'è key-paths in Swift? Come utilizzare WritableKeyPath e a cosa servono, quali problemi risolvono, quali tranelli ci sono lavorando con l'API di KeyPath?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Utilizzato per operazioni generiche con modelli (ad esempio, per ordinamento, filtraggio, binding dei dati con l'interfaccia utente).
  • Utile per costruire reflection user-friendly senza compromettere la sicurezza dei tipi.

Dettagli:

  • KeyPath solo per proprietà a cui è possibile accedere in fase di compilazione.
  • KeyPath non può contenere metodi, solo proprietà.
  • Per WritableKeyPath l'oggetto (struttura) deve essere var.

Domanda ingannevole.

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

Esempi di errori reali a causa della mancanza di conoscenza delle sfumature dell'argomento.


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.