manumateos.dev

No Space in Method Call Violation en clausura final

Es muy probable que en tu proyecto de app en Swift termines usando una sintaxis que incluya una clausura al final de las llamadas (por ejemplo, algún tipo de completionHandler). Esa sintaxis tiene una pinta tal que así:

method(param1: foo, param2: bar) { whatever in
    // Código
}

Esta sintaxis es análoga a esta otra.

method(param1: foo, param2: bar, completionHandler: { whatever in
    // Código
})

Pues bien. Tras actualizar a Xcode 13.3 (que viene, entre otras cosas, con una nueva versión de Swift, la 5.6, y sus herramientas de desarrollo asociadas) he observado que en mi proyecto cada vez que incluía una trailing closure (término que he traducido libremente como “clausura final”; no descarto cambiarlo cuando sepa cómo se dice esto en español) tenía un aviso que decía que no era conveniente poner espacios entre el nombre del método y el paréntesis. Este aviso lo pone Swiftlint, una herramienta que utilizo en mi día a día para intentar tener un código lo más limpio y uniforme posible, al menos, en lo morfológico.

¿El problema? Aparentemente un bug en alguna versión antigua de Swiftlint. ¿La solución? Como bien indican en este issue en Github, actualizar a una versión posterior de Swiftlint. Concretamente yo estoy ejecutando ahora la 0.46.5, si bien esto lleva corregido desde la 0.40.0. brew upgrade swiftlint y a volar.

(Aprovecho para enlazar a la siempre recomendable página Fucking Closure Syntax, que es una chuletilla para recordar (o copipegar, claro) la sintaxis para declarar y usar una clausura en Swift. Tiene su análoga, Fucking Block Syntax, para los que todavía trabajamos con ese lenguaje.