Novedades en Swift 5

Queda muy poco para que la versión 5 del lenguaje Swift vea la luz.

A lo largo de este artículo daremos un repaso a las principales novedades que nos traerá la próxima versión de Swift prevista para esta primavera.

Por cierto, si eres usuario de Windows 10 también puedes probar Swift en tu ordenador, sólo tienes que seguir los pasos que publiqué en esta guía de Swift + Ubuntu + Windows 10

SE-0235 Add Result to the Standard Library

Lo que muchos veníamos haciendo a la hora de tratar los errores se convierte en parte de Swift.

Con el tipo Result podemos propagar nuestros errores en entornos de ejecución asíncronas de una forma rápida y sencilla.

La enumeración Result está definido como Result<Value, Error>, donde Values es el tipo que queremos devolver en caso satisfactorio y Error es un tipo que implemente el protocolo Error.

¿Y si en lugar de un valor necesito devolver dos, o tres valores? En ese caso te recuerdo que existen las tuplas.

Aunque Error es un protocolo que puede ser implementado en culquier tipo lo normal es que sigamos la recomendación de Apple y lo implementemos en una enumeración donde definimos nuestros error personalizados.

Los valores que tiene Result son success(Value) y failure(Error)

Hay que señalar que Result tiene un constructor que acepta como parámetro un closure con throws, de manera que podríamos hacer algo como …

SE-0230 Flatten nested optionals resulting from try?

Esta nueva característica aplana los tipos Optional devueltos por la operaciónes con try? de tal manera que ahora sólo devolverán un único Optional en lugar de una sucesión de estos.

Vamos a verlo con un ejemplo…

SE-0228 Fix ExpressibleByStringInterpolation

Una nueva implementación del protocol ExpressibleByStringInterpolation aporta un mejor rendimiento, claridad y eficiencia a la interpolación en cadenas de texto.

Tenemos que implementar la extención String.StringInterpolation y añadir la función appendInterpolation(_ :) para componer la salida que queremos.

También podemos sobrecargar dicha funcion según las necesidades que tengamos

SE-0225 Adding isMultiple to BinaryInteger

Ahora los enteros tiene la función isMultiple(of:) que sirve para averiguar si el número es múltiplo de otro que se pasa por parámetro.

Veamos un ejemplo para ver cuáles son los múltiplos de 3 que hay en un array.

SE-0220 count(where:)

Se añade la función count(where:) que permite obtener el número de elementos de una colección que cumplen con una determinada condición.

Vamos a ver un ejemplo en el que obtendremos la cantidad de números pares que hay en un array.

SE-0218 Introduce compactMapValues to Dictionary

Esta nueva función es una combinación de filter/map sobre un Dictionary pero actuando sobre los valores del diccionario no sobre las claves

SE-0214 Renaming the DictionaryLiteral type to KeyValuePairs

Un cambio estético más que funcional. El tipo DictionaryLiteral se mantiene como un typelias y se marca como deprecated en Swift 5

Por lo demás, funciones y propiedades se mantienen igual

¿Y para qué se usaba KeyValuePairs, antes DictionaryLiteral? Pues…

Use a DictionaryLiteral instance when you need an ordered collection of key-value pairs and don’t require the fast key lookup that the Dictionary type provides.

SE-0200 Enhancing String Literals Delimiters to Support Raw Text

Al igual que otros lenguajes, Swift utiliza el carácter \ para el uso de los caracteres de escape y de String Interpolation.

Es propuesta nos brinda la opción de crear String en el que los caracteres de escape no se tienen en cuenta. Esto se haría delimitando el String entre los caracteres #.

¿Y si necesito usar String Interpolation? No te preocupes que podrás seguir haciéndolo, sólo que ahora declara de la siguiente manera \#()

SE-0192 Handling Future Enum Cases

Con esta propuesta nuestros bucles switch podrán tratar enumeraciones que no estén congeladas ¿Y qué quiere decir eso de congeladas? Vamos a verlo.

Imaginad que importamos un framework a nuestro proyecto que tiene una enumeración llamada Deporte con tres valores. Como programadores, desarrollamos nuestro código para que controle estas tres opciones.

Al cabo de unos meses sale una nueva versión de ese framework y como cambio añade una nuevo tipo de deporte. Si compilamos nuestros proyecto tendríamos un error que nuestro bucle switch no controla todas las opciones de la enumeración de Deportes.

Como solución se plantea que añadamos el atributo @unknown al caso default de nuestro bucle switch para que así, cuando venga nuevas versiones de la enumeración Deportes con nuevas opciones están se tratatadas con la opcion @unknown default: dentro de switch y así evitar la necesidad de cambiar nuestro proyecto.

Enlaces de interés

QUIZÁ TE INTERESE…

Adolfo Written by:

Me gustan las camisetas y las zapatillas de deporte. Desarrollo con Swift para iOS, macOS, watchOS y tvOS.. También UI/UX Me ha dado tiempo a publicar algunas apps y a escribir algún artículo. Una vez quedé segundo en un Hackathon.