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. </value,>
¿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
- Swift Evolution Proposals.
- Swift 5 development snapshot