Swift 5.2 – keyPath como funciones

Otra de las novedades más interesantes que nos traerá la próxima versión de Swift es la posibilidad de usar las keyPath como si de funciones se tratase.

¿Y vale para todas las funciones?

Buena pregunta, y la respuesta es que no. Sólo podemos pasar un keyPath cuando la función sea del tipo (Root) -> Value

Para dejarlo más o menos claro, podemos pasar cuando a la función a la que se pasemos el keyPath sea capaz de extraer el valor de dicho keyPath y que sea un tipo de devolución válido.

Mejor enséñame un ejemplo

Me parece bien, vamos a crear una lista de usuario de una empresa y vas a ver como emplear esta nueva funcionalidad para extraer los nombre de los empleados o filtrarlos para una condición.

Una vez que tenemos creados unos cuantos empleados llega el momento de saber únicamente los nombre, y para ello vamos a usar la función map

En el ejemplo vemos como se haría antes de Swift 5.2 y como podremos hacerlo a partir de ahora. En este caso el uso de keyPath como función funciona porque cumple con la regla (Root) -> Value

Simplificando mucho podríamos decir que la función map espera que le pasemos un tipo y que le indiquemos que propiedad de dicho tipo le interesa. Cuando le pasamos el keyPath estamos diciendo que lo que nos interesa extraer en la propiedad a la que hace referencis dicho keyPath

¿Y podemos encadenar llamadas como antes? Claro que sí, exactamente igual que antes

¿Y un ejemplo de cuando no cumple con la regla?

Por ejemplo cuando queremos usar la función filter. Recordar que esta función espera que se le pase una expresión que devuelve un tipo Bool

En los caso que veis arriba ninguno cumple con la regla (Root) -> Value ya que en el primero estamos preguntando si una función es igual a un valor y en el segundo queremos saber si una función es true o false

Para que funcione tendríamos que hacerlo a la antigua

Enlaces de interés

Key Path Expressions as Functions