Home » Guías » Usar librerías o código Objective-C en Swift
Tutorial Swift-Objective C

Usar librerías o código Objective-C en Swift

Una de las grandes ventajas de Swift es la posibilidad que tiene de interactuar y trabajar con clases o librerías que ya tengamos desarrolladas en Objective-C. De esta forma, en un mismo proyecto podemos usar ambos lenguajes de manera natural e integrada.

Pero existe un problema de base: Swift no tiene cabeceras ya que usa un control de acceso pre-establecido para todas las clases y ficheros que componen el proyecto. En función de cómo definamos cada componente, tendrán diferente visibilidad, siguiendo los siguientes tres tipos:

  • Privado (private): son visibles solo para la clase o fichero con que trabajamos.
  • Internas (internal): opción por defecto, que permite el acceso a todo el contexto de la app o un target del proyecto.
  • Públicas: Visibles para cualquier fichero con el objeto de usarse como una API o entre diferentes targets.

Sin embargo, Objective-C sí tiene cabeceras donde definimos qué clases o componentes vamos a usar, así como las variables o propiedades de la clase. Por este motivo, hay que pre-configurar el proyecto Swift de una manera específica para que este sepa dónde y cómo encontrar las clases o componentes de Objective-C que queremos incorporar.

Diagrama Swift-ObjectiveC

Toda esta implementación se basa en algo llamado Bridging-Header o cabecera de puente. Es un fichero .h que se integra dentro de las propiedades del proyecto y del target (es importante que esté en ambos sitios) donde se especifica, al estilo de Objective-C, que cabeceras .h de diferentes componentes van a integrarse dentro del control de acceso de Swift en tipo interno (internal).

La forma fácil, arrastrar y soltar

Bridging HeaderLa manera más simple de incluir nuestro código es coger nuestra clase .m en Objective-C y arrastrarla al proyecto en Swift. En ese momento, Xcode nos mostrará una alerta donde nos informará de la necesidad de crear estas cabeceras puente y que si queremos que las cree por nosotros. En este caso, dicha cabecera será solo para el fichero .m que ponemos.

Si el fichero se llama clase.m, generará un archivo clase-bridging-header.h y lo incluirá él sólo en los Build Settings del proyecto y del target principal de nuestra app.

La manera manual, ejemplo de uso de SQLite

¿Queréis usar bases de datos SQLite en vuestro proyecto en Swift? Pues bien, el framework que incorpora Xcode en formato .dylib es Objective-C y no funcionará en manera alguna ni podremos usarlo si no creamos nosotros la cabecera de puente.

Si incorporamos la librería sqlite3.0.dylib desde los frameworks enlazados y librerías del proyecto, veremos que se incluye y nada más. El sistema ni pide ni informa de nada. Por lo tanto, lo primero que tenemos que hacer para evitar los errores de compilación que se generarán, es crear un fichero llamado Bridging-Header.h y poner el encabezado de trabajo en SQLite:

Objective-C Bridging Header

Una vez hecho esto, vamos a Build Settings en nuestro proyecto y target y buscamos la opción Objective-C Bridging Header, hacemos doble click a la derecha del nombre y sobre la ventana emergente escribimos el nombre de nuestro archivo.

Ojo, porque si no ponemos ruta buscará el mismo en la misma carpeta donde reside nuestro fichero de proyecto .xcodeproj. Por lo tanto, si está en otra carpeta, deberemos poner la ruta relativa hasta este (siempre partiendo de la carpeta base del proyecto donde el .xcodeproj reside).

Si todo ha ido bien, podremos compilar sin problema. Luego, ya podéis hacer vuestra propia implementación de SQLite o usar uno de los muchos wrappers disponibles por la red que facilitan el uso de esta base de dato. El que más nos ha gustado a nosotros por su sencillez a la hora de implementarlo y usarlo es SQLiteDB, creado por Fahim Farook.

Este sistema es muy útil para integrar frameworks de terceros como Google Analytics o Flurry, donde tienen una librería .a precompilada en Objective-C y una serie de cabeceras. Lo único que hemos de hacer es incluir la cabecera que corresponda en nuestro Bridging-Header.h y listo. Todo funcionará sin problema.

Como siempre, probad, trabajad, experimentad… y si tenéis cualquier ya sabéis dónde estamos. 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

Codable (I)

Codable (I), cargando un JSON hacia un struct

Aprendemos a cómo cargar el contenido de un archivo JSON directamente en instancias de tipo struct con el nuevo protocolo Codable y la serialización de Swift 4. Un proceso no solo simple, sencillo y potente, si no que nos evita tener que usar diccionario, sabernos claves de memoria... simplemente cargamos el JSON, parseamos y listo. Magia Swift 4.