Vamos a dar un repaso breve a todas las novedades que nos ofrece la última actualización de Swift.
Las principales mejoras no están en cambios en el mismo lenguaje, ya que Swift tiene una API estable desde su versión 3 y prácticamente el 99% del código que se desarrolle en esa versión seguirá funcionando en esta última. Lo que Apple ha hecho es mejorar sustancialmente «las tripas» del lenguaje mejorando e incorporando nuevas funciones que permiten un mejor análisis y detección de errores mientras escribimos nuestro código.
Arquitectura de diagnóstico
Una de las primeras mejoras fue hecha en cambiar la arquitectura de diagnóstico del lenguaje a una nueva y mejorada. Esta arquitectura es lo que permite analizar el código mientras lo escribimos y detectar errores en el mismo incluso antes de compilar nuestro programa.
“Apple ha mejorado la experiencia de uso del lenguaje a través de una nueva arquitectura de diagnóstico que permite dar una información más precisa en los errores que se encuentren en el código, así como arreglos rápidos para muchos de esos errores”.
Si tú ya has programado con Swift, sabrás que en ocasiones su «exactitud» en señalar un problema en el código, no era la mejor. Y ese problema se agravó enormemente al llegar SwiftUI cuya estructura DSL (lenguaje específico para dominio) cambió la forma general de representación del mismo para con el uso de dicha librería.
Apple, sabiendo esta situación, se puso a trabajar desde hace ya varios meses incorporado un nuevo motor de arquitectura de diagnóstico que nos dirá de forma más precisa dónde está el error, y no solo eso, también nos sugerirá más «fixes» (soluciones rápidas) para que el código se arregle y se muestre como debería.
Usando un ejemplo de la propia Apple, en la versión anterior del lenguaje, si creábamos el siguiente código:
enum E
{ case one, two }
func check(e: E) {
if e != .three {
print("okay")
}
}
En este código podemos ver que se enumeran dos posibles valores: one y two. Nada más. Pero en la función check preguntamos por un hipotético valor three que obviamente no existe. Hasta ahora, el error que nos daba tenía que ver con el operador de comparación de no igualdad (el !=) donde nos decía que ambos tipos de datos no podían ser comparados pues los detectaba como diferentes. Un error inexacto.
Con la nueva versión del motor, nos dirá exactamente que el valor three no existe en la enumeración E, con lo que podemos entender de una forma más exacta el problema.
Con este simple ejemplo nos damos a la idea de este profundo cambio que nos ayudará a que el análisis del código sea más preciso indicándonos de forma eficiente (y rápida, ya que se ha mejorado el propio algoritmo subyacente) dónde están los errores en el código.
En la arquitectura de diagnóstico, también se ha mejorado sustancial el motor de completado de código, que nos sugiere qué código escribir mientras lo escribimos (y así no tener que recordar siempre el nombre exacto de cientos o miles de métodos, variables o elementos que tengamos en nuestro programa, así como los de las librerías que usemos). Este motor ha mejorado su eficacia entre un 1.2 y un 1.6x eliminando comprobaciones redundantes.
“LSP es un estándar abierto creado por Microsoft que busca crear un único estándar abierto a la hora de trabajar e implementar soluciones de gestión del código en cualquier lenguaje de programación”.
La arquitectura LSP (Language Server Protocol) de Microsoft es parte responsable de este cambio que Apple ha incorporado al etiquetado, proceso y completado de código. Al usar Apple esta tecnología, en breve, cualquier editor o programa de terceros (como Sublime Text, Visual Studio Code o incluso IDEs como Visual Studio) podrá autocompletar, analizar y gestionar el código en Swift de la misma forma y con el mismo motor que usa Xcode, lo que dará una experiencia más sostenible incluso entre diferentes sistemas operativos.
Mejoras en el compilador
Una de las cosas más importantes en la programación es el compilado de un programa y su velocidad. Es lo que traduce nuestro código en algo que un sistema operativo pueda entender. Aquí Apple también se ha puesto las pilas y ha mejorado sustancialmente la velocidad de los procesos de compilación final (release) y para depuración (debug).
Para esta actividad, se han optimizado los dos modos más usados: el incremental (que detecta y compila solo los cambios reales en el código entre compilación y compilación, y así mejora el tiempo en las pruebas de nuestro programa) y el de la optimización del módulo completo (o WMO) que es usado cuando queremos crear la versión final de nuestro programa y que pone todo el código en un solo fichero, trabajándolo de forma completa para un enlace más eficiente.
A este cambio se han incorporado también importantes mejoras en el depurador que nos permite ejecutar nuestro programa línea a línea, ver su comportamiento mientras se ejecuta y extraer datos que nos ayuden a detectar errores en tiempo de ejecución.
Incorporaciones en el código
struct Dado { var caras:Int func callAsFunction() -> Int { Int.random(in: 1…caras) } } let dado1 = Dado(caras: 8) let resultado = dado1()Como podemos ver, creamos la instancia del struct Dado, y podemos ejecutarlo como una función llamando a dado1() a pesar de no indicar de forma explícita el nombre de la función ya que callAsFunction hace las veces de función asociada a la propia instancia.
Apple solo ha incorporado dos cambios al lenguaje en esta versión: versión llamadas implícitamente desde la raíz de una instancia y key path en las funciones que reciban un dato raíz.
También, en programación funcional podemos usar una nueva forma de referenciar a los elementos dentro de las funciones de orden más alto de la programación funcional, así como cualquier otra función implícita que reciba como parámetro la instancia de un dato.
Antes había que usar el parámetro abreviado $0 seguido del nombre de la propiedad (como $0.name) y ahora podemos usar la referencia a través de un key path con la barra invertida: .name, dando por hecho que . corresponde a la raíz de la instancia recibida por parámetro. Una pequeña mejora semántica que hace más claras las referencias.
Pequeñas mejoras
Sin duda, Swift es uno de los proyectos más prometedores de Apple en todos los sentidos y donde más esfuerzo y trabajo están poniendo. No solo por la propia compañía y todas las empresas que colaboran en el proyecto como lenguaje de código abierto.