ProgramaciónDesarrollador iOS

¿Qué son los key-paths en Swift? ¿Cómo usar WritableKeyPath y para qué sirven, qué problemas resuelven, qué trampas existen al trabajar con la API de KeyPath?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Se utiliza para el trabajo genérico con modelos (por ejemplo, al ordenar, filtrar, vincular datos con la interfaz de usuario).
  • Es conveniente para construir una reflexión fácil de usar sin perder la seguridad de tipos.

Detalles:

  • KeyPath solo para propiedades a las que se puede acceder desde el compilador.
  • KeyPath no puede almacenar métodos, solo propiedades.
  • Para WritableKeyPath, el objeto (estructura) debe ser var.

Pregunta capciosa.

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

Ejemplos de errores reales debido al desconocimiento de los detalles del tema.


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.