Home » Swift » Interfaces entre Swift 3 y Objective-C
Banner Swift 3 - ObjC

Interfaces entre Swift 3 y Objective-C

Está claro que Apple no puede despegarse por completo de Objective-C, ya que gran parte (todavía) de sus librerías de desarrollo y herramientas siguen desarrolladas en este lenguaje. Por este motivo, la unión entre ambos lenguajes es muy importante y entender cómo se realizan los diferentes tipos también.

Una de los cambios más importantes en Swift 3, a nivel de interfaces o protocolos (según los llamemos en uno u otro lenguaje) es su correspondencia. En Swift 2, el interfaz id que es el de mayor nivel en Objective-C y engloba a todos los tipos del sistema (sean o no objetos) tenía su equivalente en AnyObject, protocolo al que se conformaba (por ejemplo) un array que tuviera diferentes tipos de primer nivel como Int, String o Double, todos dentro de un mismo array. Por lo tanto, se realizaba una conversión implícita en los tipos entre referencia y por valor.

En Swift 3 esto ha cambiado y ahora ya no conforma con objetos, si no con el protocolo Any que se conforma con todos los tipos disponibles del sistema, tal como el interfaz id hacía en Objective-C. Y por lo tanto, ahora sí se distingue entre tipos por valor y tipos por referencia y ya no todo son objetos en el mapeado entre tipos entre los dos lenguajes.

Lo que quiere decir esto es que el mapeo de equivalencias entre lenguajes (para que sean compatibles entre sí) ha cambiado y ahora id está unido a Any de la misma forma que en Swift 2 lo estaba a AnyObject. Sin embargo, ahora AnyObject cumple una función más lógica englobando solo a los tipos que sí son realmente por referencia. Nunca hemos de olvidar que los array en Objective-C son tipos de datos por referencia (objetos) mientras que en Swift lo son por valor, aunque sus tipos estén mapeados los unos con los otros.

De esta forma las APIs en Objective-C son más flexibles porque ahora cuando trabajemos con una librería de este, el tipo de Swift puede pasarse tal cual es sin transformarlo en objeto. Y de igual forma permite que los tipos de colecciones de Objective-C como NSArray o NSDictionary que en anteriores versiones solo admitían tipos de datos AnyObject, ahora pueden almacenar cualquier dato de tipo Any sea o no por referencia.

Y para asegurar la consistencia de todo, Swift 3 implementa un nuevo protocolo para los tipos que conforman con Hashable, aquellos que pueden ser usados como índice en un diccionario (por ejemplo). De esta forma, ahora tenemos un nuevo protocolo de alto nivel AnyHashable que en caso de conformarse con el tipo que usemos, nos asegura que es Hashable y engloba a todos los que cumplen con este.

Objective-CSwift 2Swift 3

Esto supone pocos o ningún cambio en nuestro código y en la mayoría de los casos el asistente de migración de Swift 3 se encargará de ello. Por ejemplo, uno de los cambios es que ahora, si tenemos un array que sea de diferentes tipos, tendremos que hacerle un casting a as [Any] para que el lenguaje lo conforme sin problema y no se hará de forma inferida como sucedía en Swift 2.

Además, al hacer este cambio y diferenciar entre tipos por valor y tipos por referencia, las conversiones implícitas entre objetos y tipos por valor no están permitidas en Swift 3 y hay que indicarlas con el uso de as. Así que el uso implícito de cualquier tipo de Objective-C requerirá el uso del as como as NSString o as String.

Seguiremos comentando más cambios en el lenguaje, y mientras seguid practicando. Un saludo y Good Apple Coding.

Acerca de Julio César Fernández

Analista, consultor y periodista tecnológico, desarrollador, empresario, productor audiovisual, actor de doblaje e ingeniero de vídeo y audio.

Otras recomendaciones

Swift 3.1 Hoja de Ruta

Swift 3.1, hoja de ruta hasta primavera de 2017

Swift 3.1 marca su hoja de ruta de aquí a primavera de 2017 con dos grandes retos: la compatibilidad de código con la versión 3.0 y potenciar el gestor de paquetes y la integración con servidor para conseguir aun más rendimiento en soluciones como Kitura, Vapor o Perfect (entre otros). Descubre los detalles en nuestra noticia y qué nos depara esta nueva versión menor del lenguaje.