Saltar al contenido →

Closures, Genéricos y SE-0111

Si has tenido que programar algún framework o función que recupera datos de un servidor seguro que has usado blocks/closures a modo de callback para devolver los resultados al usuario.

Para definir este callback bien lo hacías directamente en la declaración del método que lo usaba o como un tipo mediante typedef (a mí es la que más me gusta)

Una de las mejoras que incorpora Swift 3 es la posibilidad de usar como genéricos estas funciones o callbacks, de tal manera que nos ahorramos un montón de definiciones (aquellos que seamos amantes del uso de typedef)

Y ahora es cuando tras haber mirado el ejemplo me preguntas ¿Y el nombre del parámetro del tipo genérico dónde está? Pues es ahí, querido amigo, donde entra en juego la propuesta SE-0111.

¿Y de qué va la SE-0111?

Bajo el título de Remove type system significance of function argument labels se encuentra la causa de que a partir de Swift 3 la definición de funciones (closures) no pueda incluir el nombre de su parámetro correspondiente.

Swift’s type system should not allow function argument labels to be expressed as part of a function type.

¿Si tiene lógica hacer esto? Yo creo que sí ¿Que si se pierde legibilidad? Pues también te digo que sí.

De echo este cambio ha generado bastante revuelo y comentarios, incluso hay quien lo ha tachado de regresión. Pero no perdamos la calma, que sí que hay una manera de cumplir con la propuesta y no perder legibilidad.

Lo único que tenemos que recordad es que Swift permite omitir el nombre de parámetro en la llamada a sus funciones poniendo el caracter _ como nombre externo del parámetro.

De esta manera podemos definir closures que cumplen con la nueva propuesta y añaden un nombre de parámetro, que para mí es de gran ayuda a la hora de clarificar lo que estás usando/llamando

Enlaces de interés

Propuesta SE-0111: Remove type system significance of function argument labels
Blog de Erica Sadun: Paleogene Therapy: What’s up in Swift Evolution

Publicado en Swift