Usar Swift en clases Objective-C

¿Por qué deberías considerar usar Swift en clases Objective-C?

Si alguna vez te has preguntado sobre la verdad de la completa interoperabilidad entre Swift y Objective-C en el mismo proyecto..

Quizás tu tienes una aplicación antigua de iOS basada en Objective-C y has considerado si empezar a incluir nuevas clases en Swift..

Y tu quieres también que el código sea más accesible para nuevos desarrolladores iOS..

Sólo tengo que decirte ADELANTE y LISTO PARA LUCHAR!

No voy a decirte que todo va a funcionar mágicamente a la primera.. a veces se puede convertir en una pequeña pesadilla, sin embargo, con convinción y paso a paso, merecerá la pena y empezarás a refrescar tu aplicación.

Continúa leyendo y encontrarás consejos a tener en cuenta para hacerte una transición más suave en el proceso de usar Swift en clases Objective-C.

 

Importar Cabeceras para usar Swift en clases Objective-C

Usar Swift en clases Objective-C

Ficheros de cabeceras Swift auto generados

Estos ficheros que automáticamente genera Xcode, son los ficheros que hacen la magia de hacer de puente entre las clases de Swift y nos permitirá usarlas en las de Objective-C.

No los busques dentro del proyecto, no son locales.

Una consideración importante que tienes que tener en cuenta es el nombre exacto de estos ficheros para importarlos.

Estos ficheros tienen un nombre de prefijo, seguido de la palabra «Swift» y con extensión de cabecera «.h» ej: Name-Swift.h

El nombre del prefijo no es el nombre de tu proyecto (o target si usas también extensiones), es el product module name.

 

Product module name

Es el nombre que identifica uniequivocamente cada uno de tus targets. Puede que sea el mismo pero puede que no.

Puedes comprobar el nombre exacto desde las opciones de settigns en cada uno de tus targets, no el proyecto. En la vista de settings busca por Product module, estará en la sección Packaging, asegúrate de tener la opción Mostrar «todo» seleccionada.

Usar Swift en clases Objective-C

Ficheros Swift Bridging header

Ahora que sabes el nombre exacto, necesitamos importarlo en cada fichero Objective-C en la que quieras usar algunas clases en Swift.

#import <ProductModuleName-Swift.h>

 

Import Swift class

Debajo de la importación del fichero de cabecera Swift en tu clase Objective-C, necesitas importar tu clase Swift.

@class SwiftClassName;

 

Limpia y relanza el proyecto

Mejor que te aprendas los siguientes atajos de teclado porque los vas a necesitar mucho.

shift+cmd+k       Clean

shif+cmd+b       Analyze

cmd+r         Run

 

Si con esto sigues teniendo algunos errores de compilación haciendo el bridging Swift – Objective-C tales como: no se puede encontrar el fichero Swift de cabecera, o si estás intentando usar una clase de Swift y no la encuentra o no puede usar alguna clase de Swift porque no se encuentra el selector…, comprueba tienes bien seteado las siguientes opciones.

 

Swift class definition @objc

Asegúrate que la clase Swift que estás intentando usar usa el prefijo @objc y hereda de NSObject

Un consejo, intenta añadir la función como «public», y comprueba que no tengas ningún error en tu clase de Swift.

 

Ajustes de compilación y proyecto

Comprueba Defines module project build settings

En las propiedades de tu proyecto busca por  “Defines Module” debajo de la sección Packaging y asegúrate está activa.

Usar Swift en clases Objective-C

 

Comprueba en los ajustes de compilación Generated Header name

Comprueba que los nombres de los ficheros de cabecera Swift en las propiedades de compilación de cada uno de tus targets son las correctas.

Usar Swift en clases Objective-C

Puedes usar un parámetro como el siguiente:

Usar Swift en clases Objective-C

Bridging Header name en propiedades de compilación

Esto es menos importante ahora para este caso en el que queremos usar Swift en clases Objective-C y no al revés. Hablaremos en más profundidad de esto en otro artículo.

 

Errores de compilación

¿Te encuentras en un bucle? ¿No sabes que está mal? ¿Lo que Xcode señala como fallo debería estar bien?

Comenta las líneas con errores de compilación, limpia y relanza la app otra vez para igual descubrir los verdaderos problemas y dejar que el compilador los detecte.

El error puede ser el resultado pero puede no ser la causa del problema.

 

Conclusiones

Usar Swift en clases Objective-C

Limpia, analiza y relanza la app una y otra vez para forzar a regenerar el fichero que permite usar Swift en clases Objective-C después de cada cambio.

Y paciencia.. a veces Xcode se toma un tiempo para darse cuenta.

Si tu fichero de bridging ha sido generado correctamente tu podrás navegar a él a través del nombre de la importación. Comprueba que en él se encuentran las propiedades que tu esperas.

Si todavía tienes algunos problemas y para más información comprueba también consejos en la guía de documentación de Apple.

Realmente espero que estos consejos te séan de utilidad.

En otros artículos continuaremos hablando sobre más consejos para usar ciertas propiedades desde Swift a Objective-C y viceversa y usar clases Objective-C en clases Swift.

 

Ahora ya estás listo para empezar a incluir las neuvas funcionalidades que vienen con iOS 11 en tu app, mira este artículo que analiza las nuevas funcionalidades incluidas en iOS11.

¿Ya te has pegado bridging Swift- Objective-C clases? ¡Déjanos tus comentarios!

 

 

 

1 comentario en «Usar Swift en clases Objective-C»

  1. Buenas, estoy en atasco con el proyecto y precisamente es sobre esto que estáis comentando. Estoy creando una sdk en swift mediante pods. A su vez, tiene una dependencia de otra librería de pods pero esta en Objective-c. Hasta aquí en un proyecto tal cual va bien. El problema está cuando quiero crearme un pod con mi sdk que tenga por detrás la otra dependencia de Obj-C. Cuando le pongo el Bridging-Header en el pod, me dice que no… Me genera este fallo:
    using bridging headers with framework targets is unsupported
    Command CompileSwiftSources failed with a nonzero exit code
    Sabéis el por qué puede ser?

    Responder

Deja un comentario

¿Necesitas una estimación?

Calcula ahora