El lenguaje de programación de desarrollo propio de Apple «Swift» está en su quinta generación y están sucediendo muchas cosas. Swift finalmente está obteniendo la tan esperada «estabilidad ABI», pero también hay muchas mejoras en el lenguaje en sí.
¿Qué es la estabilidad ABI y por qué es tan importante? Los programadores no se dan cuenta cuando se le otorga estabilidad ABI a Swift, ya que esto solo tiene un efecto en la “sala de máquinas” de Swift. ABI son las siglas de «Application Binary Interface». Define cómo exactamente se almacenan en la memoria las funciones, variables, constantes, etc. Una vez que esto se haya determinado, no se puede cambiar en futuras versiones de Swift; de lo contrario, las aplicaciones más antiguas ya no se ejecutarán. Es por eso que debe pensar detenidamente cómo debería verse el ABI final antes de configurarlo de una vez por todas. Especialmente con respecto a futuras ampliaciones del idioma.
Es por eso que Apple tardó mucho tiempo en hacer esto. Originalmente, se suponía que la estabilidad ABI vendría con Swift 3, pero se pospuso. Luego se dijo que vendría con Swift 4, se pospuso nuevamente. Ahora llega Swift 5 y finalmente Apple declara que Swift ABI es estable.
Pero, ¿qué significa exactamente este gran paso para los desarrolladores y los usuarios? Respire aliviado: los desarrolladores no tienen que preocuparse porque el código fuente de sus aplicaciones permanece intacto. Pero en realidad hay efectos para el usuario, incluso muy positivos. Hasta ahora, cada aplicación tenía que contener todas las bibliotecas de funciones de Swift que utiliza en tiempo de ejecución. Estas bibliotecas pueden tener un tamaño de varias decenas de megabytes, según la funcionalidad de la aplicación. Después de la determinación final de la estabilidad de ABI, Apple puede integrar firmemente las bibliotecas en iOS y todas las aplicaciones acceden a estas bibliotecas, que solo están disponibles una vez. El resultado: las aplicaciones son cada vez más pequeñas, ocupan menos espacio en el iPhoneo iPad! ¡Una cosa buena!
Aplicaciones más pequeñas
Pero, ¿cuánto importa eso en la práctica? Eso es exactamente lo que queremos averiguar. La estabilidad ABI proviene de Xcode 10.2 Beta (lanzado en enero de 2019) e iOS 12.2 Beta. Estamos instalando la versión beta de Xcode 10.2 en nuestro Mac de desarrollo. Atención, esta versión beta solo se ejecuta en macOS 10.14 Mojave. Las versiones anteriores de macOS quedan fuera y las versiones beta actuales de macOS no son adecuadas para Xcode 10.2.
Creamos un proyecto Swift nuevo y vacío (vista única) y simplemente colocamos una etiqueta «¡Hola, mundo!» En el centro de la pantalla. Ahora configuramos el objetivo de implementación en iOS 12.1 en Xcode.
Esto obliga a Xcode a crear dos archivos binarios de la aplicación. Uno que aún contiene todas las bibliotecas Swift que se utilizan (porque aún no están disponibles en el sistema operativo en iOS 12.1) y otro que ya no las contiene (para dispositivos con iOS 12.2 o mas alto). Pero hay un problema, porque Xcode siempre carga una versión especial de la aplicación en la App Store, que contiene todas las bibliotecas requeridas, independientemente del conjunto de destino. Solo se eliminan nuevamente y se adaptan al dispositivo específico y al sistema operativo existente cuando un usuario descarga la aplicación de la tienda. Para simular esto, puede crear una denominada «Distribución de desarrollo» en Xcode, que se adapta a un dispositivo muy especial. Esta versión no se convierte en Applesubido a la Tienda, pero en su lugar guardado en el disco duro de Mac del desarrollador. Es importante que active el llamado “App Thinning” seleccionando un dispositivo iOS específico en el emergente correspondiente (en nuestro caso un iPhone XS).
Después de que Xcode haya compilado el código fuente y exportado la aplicación, echemos un vistazo más de cerca a la carpeta de exportación. De hecho, hay dos archivos.ipa (las aplicaciones de iOS siempre tienen la terminación «.ipa»). Uno de ellos es de 2,4 MB (exactamente: 2,375,827 bytes), el otro solo 26 KB (exactamente: 25,540 bytes). Esto corresponde a un ahorro de más de 2,3 MB por aplicación instalada, en el caso más simple, porque nuestra aplicación de demostración apenas utiliza bibliotecas de funciones. Normalmente, es probable que los ahorros sean aún mayores.
Suponiendo que normalmente tiene 100 aplicaciones programadas en Swift en su iPhone, eso suma la friolera de 230 MB. Bueno, ¡vale la pena!
Desafortunadamente, no puede recuperar este espacio de inmediato simplemente instalando iOS 12.2 (una vez que esté oficialmente allí). Los desarrolladores finalmente tienen que regenerar las aplicaciones en Swift 5 / Xcode 10.2 y cargar estas versiones en la App Store. Pero se puede suponer que esto sucederá gradualmente durante los próximos meses. Por lo tanto, puede esperar más memoria libre en el iPhone y el iPad.
Hay muchas otras características nuevas en Swift 5 y Xcode 10.2. Algunos de ellos son bastante interesantes o importantes.
No más conversión automática de Swift 3
Los desarrolladores deben tener cuidado, porque a partir de Xcode 10.2, Swift 3 ya no convierte automáticamente el código fuente. Si desea adaptar su código a Swift 5 y aún usar Swift 3 Synthax, primero debe cambiar a Swift 4 con Xcode 10.1 y luego usar Xcode 10.2 / Swift 5.
Cuerdas crudas
Cualquiera que trabaje mucho con cadenas literales conoce el problema:
Esta línea sale mal, porque para Swift la cadena literal termina en las comillas antes de «Pangalactic…». Xcode arroja los mensajes de error apropiados. Hasta ahora, podía moverse por aquí con códigos de escape, una barra invertida delante de cada comilla resuelve el problema:
Pero eso se ve feo y también es más difícil de leer. Con las nuevas cadenas sin procesar ahora puede resolver esto de la siguiente manera:
Un hashtag (también conocido como signo de almohadilla) antes y después de la cadena literal convierte toda la cadena en una cadena sin formato. Entonces, las comillas en el literal se consideran parte de la cadena. Esto es mucho mejor y las cadenas sin procesar también se pueden combinar con interpolaciones de cadenas.
Tenga en cuenta el hashtag # delante de » (respuesta)». Sin esto, » (respuesta)» simplemente contaría como parte de la cadena sin procesar. Entonces, si desea que la interpolación de cadenas tenga lugar en una cadena sin formato, debe insertar el hashtag adicional #. Gracias al color del código, puede ver inmediatamente dónde se oculta una interpolación de cadena en el literal de cadena.
Verificar números enteros
El nuevo método «isMultiple (of :)» comprueba las variables enteras en busca de múltiplos. Tiene este aspecto, por ejemplo:
Aquí verificamos un número entero si es par o impar. Bueno, con la variante anticuada de verificar el resto de una división por 2 para cero usando el operador «Módulo 2», eso, por supuesto, aún funcionaría, pero eso no es tan fácil de leer y el método «.isMultiple (of 🙂 “Aparece en la lista de finalizaciones de código. Esto hace que sea más rápido encontrarlos al programar.
Nuevo tipo de resultado estándar «Resultados»
Aquellos que programan aplicaciones que acceden a datos de forma asincrónica desde la red apreciarán particularmente este nuevo tipo de datos. El tipo de resultado se implementa como una enumeración (tipo de datos: «enum») con dos casos: éxito y fracaso. Ambos se implementan utilizando genéricos para que puedan tener el valor que desee el desarrollador. Sin embargo, el caso de error debe corresponder al tipo de error de Swift.
Sobre todo, el nuevo tipo de datos de resultado simplifica el manejo de errores si una URL es incorrecta, la red no está disponible actualmente o la consulta lleva demasiado tiempo y la aplicación agota el tiempo de espera. Hasta ahora, estos casos tenían que ser interceptados individualmente con consultas de error complicadas (estructuras «try / catch»), que a menudo conducían a problemas impredecibles o incluso a un bloqueo de la aplicación. El nuevo tipo de datos garantiza más seguridad para el usuario y menos esfuerzo para el desarrollador para detectar posibles errores.
Llamables dinámicos
Los invocables dinámicos se pueden utilizar para llamar a tipos de datos, por ejemplo, estructuras, así como funciones, es decir, insertar métodos y propiedades. Es posible transferir un número variable de parámetros a las instancias de estos tipos de datos. Esto puede resultar extremadamente útil para determinadas aplicaciones, pero es poco probable que se utilice de forma generalizada. En última instancia, esta función debería facilitar el trabajo con Swift además de con lenguajes dinámicos como Python y JavaScript.
Outlook, Swift 5.1 llegará pronto
Las nuevas funciones mencionadas aquí son solo una pequeña parte de la lista de todas las funciones nuevas en Swift 5 y continuarán: Swift 5.1 ya está en proceso. También habrá novedades interesantes aquí. Después de la estabilidad ABI, la estabilidad del módulo ahora está pendiente. Se trata de la estructura exacta de las bibliotecas de funciones. Esto también debe especificarse para que los compiladores futuros, por ejemplo para Swift 6, sigan siendo compatibles con las bibliotecas existentes y viceversa. Tan pronto como Swift 5.1 esté finalizado (eso podría suceder en marzo de 2019), estaremos en contacto nuevamente en este punto.
Conclusión
Swift continúa moviéndose. Es bueno ver que el lenguaje no es estático, sino que se desarrolla orgánicamente y constantemente se agregan nuevas funciones y posibilidades.