El key-path (camino clave) es un mecanismo de acceso seguro a las propiedades de los objetos "por referencia". Proporcionan un acceso completo y seguro en cuanto a tipos para acceder a las propiedades:
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 — permite no solo leer, sino también modificar las propiedades:
var person = Person(name: "Foo", age: 22) let namePath: WritableKeyPath<Person, String> = \Person.name person[keyPath: namePath] = "Bar"
Uso:
Detalles:
WritableKeyPath, el objeto (estructura) debe ser var.Pregunta: "¿Se pueden cambiar las propiedades de una clase a través de un KeyPath normal (o se requiere WritableKeyPath)? ¿En qué se diferencian KeyPath y ReferenceWritableKeyPath?"
Respuesta: Para cambiar el valor de una propiedad a través de un key path se necesita WritableKeyPath. Para las clases también existe ReferenceWritableKeyPath, que permite cambiar propiedades por key-path para tipos de referencia.
class User { var score = 0 } let user = User() let path: ReferenceWritableKeyPath<User, Int> = \User.score user[keyPath: path] = 42 // OK
Historia
En un gran proyecto de UI basado en tablas se confundieron los KeyPath normales y los WritableKeyPath — intentaron cambiar una propiedad del modelo a través de KeyPath, lo que resultó en una excepción en tiempo de ejecución.
Historia
Al generar formularios genéricos, se usaron KeyPath para vincular valores, pero intentaron reflexionar métodos como keypaths, lo que llevó a la imposibilidad de compilar y complicó el código.
Historia
El desarrollador olvidó agregar ReferenceWritableKeyPath para las clases, lo que obstaculizaba la vinculación bidireccional entre la interfaz de usuario y el modelo de datos: los valores se actualizaban en la interfaz de usuario, pero el modelo permanecía igual.