Aprenderemos algunas de las novedades más importantes que nos trae Apple con Swift 1.2
Swift 1.2
La pasada semana Apple «nos sorprendía» con el lanzamiento de la versión definitiva de iOS 8.3, Mac OS X Yosemite 10.10.3, y Xcode 6.3. Con este último lanzamiento, Xcode 6.3, llega a nosotros Swift 1.2, una revisión del lenguaje que nos viene a traer algunas novedades interesantes, mejoras en rendimiento y tambien algunos cambios que deberemos conocer.
¿Qué mejoras aporta Swift 1.2 a nuestras apps?
Swift 1.2 nos trae algunas mejoras de rendimiento que van a hacer tanto nuestras apps como programar en Swift algo mucho más rápido.
- No compilar lo mismo una y otra vez: a partir de ahora, Xcode ya no necesita recompilar cada archivo de tu proyecto cada vez que lanzas un Build and Run. Esto supondrá una rapidez mayor en la compilación y ejecución de nuestras apps como podréis observar si ya estais trabajando con Xcode 6.3. Sin duda, en proyectos de grandes dimensiones será más notable esta mejora.
- Mejoras en rendimiento del lenguaje: muchas funcionalidades de base del lenguaje han sido optimizadas, como el manejo de arrays multidimensionales, lo cual hará que las mismas apps que ya teníais desarrolladas, ahora simplemente por migrarlas a Swift 1.2, correrán más rápido.
¿Qué es eso de migrar a Swift 1.2?
Pues lo que estáis oyendo, si tenemos un proyecto construido en una versión anterior de Swift, veréis que al ejecutarlo nos encontramos con errores de compilación.
¿Y debo revisar todo mi código y hacer los cambios?
No es necesario, Apple ha puesto a nuestra disposición en Xcode 6.3 una opción de menú para migrar automáticamente nuestras apps. Lo tenéis disponible en el menú Edit \ Convert \ To Swift 1.2
.
¿Y qué cambios nos trae el lenguaje?
If let
El primero de ellos es una simplificación en el uso de if let
para comprobar optionals
.
Éste código:
1 2 3 4 5 6 7 8 9 10 |
if let usuario = agenda.getUser() { if usuario.isActivo { if let telefono = usuario.telefono { // hacer algo } } } |
Ahora es tan sencillo como ésto:
1 2 3 4 5 6 |
if let usuario = agenda.getUser() where usuario.isActivo, let telefono = usuario.telefono { // do something } |
Es decir, que podemos anidar como si de una cláusula WHERE
de SQL se tratase, todas las condiciones de tipo if let
o no, hasta llegar al resultado esperado.
Upcasts y downcasts
El concepto de upcast consiste en convertir un superior a nivel herencia un objeto de un nivel inferior, es decir, cuando tenemos un objeto Mujer (mas concreto), y lo convertimos en objeto Persona (menos concreto). El concepto de downcast (mas típico) es justamente hacer lo contrario.
Pues bien, para realizar ambas tareas se utiliza el operador as
.
En el caso del upcast podemos utilizar simplemente el operador as para la conversión sin ningún modificador, ya que en tiempo de compilación veremos si es correcta la conversión, y por tanto nunca se produciran errores de ejecución.
1 2 3 4 |
let persona = miMujer as Persona |
En el caso de hacer un downcast, si utilizabamos antes de Swift 1.2 el operador as sin modificador, podiamos encontrarnos con que en tiempo de ejecución no se pudiera hacer la conversión o casting, y por tanto recibieramos un temido error en ejecución.
Ahora en Swift 1.2 esto ya no es posible, porque es obligatorio utilizar as?
o bien as!
. En el primer caso estaremos haciendo el denominado optional casting, es decir, que si se puede hacer bien, y sino que guarde un nil. En el segundo caso, con el uso de as!
le estamos diciendo a Swift que nosotros estamos completamente seguros de que esa conversión va a funcionar sin problema.
Por resumir, el cambio es que antes por descuido podíamos dejar al azar el resultado del casting y ahora es obligatorio «mojarnos» utilizando as!
, o bien decirle al sistema que tenemos dudas utilizando as?
. Evidentemente, la opción mas segura, siempre va a ser la segunda.
Sets
Seguro que muchos ni lo habiais echado de menos, pero Swift hasta ahora unicamente tenia a nivel colecciones: NSString / String
(que es un array de caracteres), NSArray / Array
y NSDictionary / Dictionary
. Pues bien, llega a nuestros Xcode la estructura Set
.
Los Set
no son mas que colecciones que nos permiten almacenar objetos de un tipo que necesariamente tenemos que indicar en su definición, y donde no se pueden almacenar objetos duplicados (lo gestiona por nosotros no insertando la segunda copia del objeto).
1 2 3 4 5 6 7 8 9 10 |
var nombres = Set() nombres.insert("Miguel") nombres.insert("Omar") nombres.insert("Miguel") // Este no lo añadirá println("\(nombres.count)") // Devolverá 2 |
Con los Set
de Swift podréis hacer como en Objetive-C todo lo esperado, como uniones, comprobar si existe un objeto, listar todos los valores, etc.
Compatibilidad con Objective-C
Hasta ahora, Apple ha ido incorporando la versión Swift de cada una de las clases base de Objective-C, y hemos podido utilizar cualquiera de las dos opciones. Pues a partir de Swift 1.2 esto ya no es posible.
Un String
ya no es un NSString
Igualmente, si queremos seguir utilizando esta compatibiliad basta con que hagamos la conversión mediante un casting con el operador as
:
1 2 3 4 5 |
let myString : NSString = "pepe" formatString(myString as String) |
En este ejemplo, el método formatString
espera recibir un objeto String
de Swift, y estamos convirtiendo nuestro NSString
a dicho formato mediante el operador as
.
Y mucho más
Existen muchas mas novedades, pero he creido oportuno recoger aquí las que considero que son mas trascendentes o de mayor uso.
Utilizar los comentarios del post si queréis incluir alguna mejora importante que hayamos podido olvidar, y tenéis el foro de Swift si queréis preguntar cualquier cosa al respecto.
Desgraciadamente me he enterado tarde de la opción de migrar, cuando he abierto un proyecto que tenemos entre varias personas me he dado cuenta de que habían cosas que no compilaban y las he ido cambiando a mano, tampoco me ha costado demasiado.
Es lo que tiene usar un lenguaje nuevo, aún así no me arrepiento, me parece una herramienta muy potente.
Muchas gracias por el resto de aclaraciones.