Objective-C y Swift: dos mundos, un proyecto
\n\n¿Escribes en Swift, pero tienes a tu disposición una biblioteca escrita en Objective-C, o código antiguo pero probado en ObjC? ¿Una situación familiar? No te preocupes: Apple ha previsto un excelente mecanismo para que estos dos lenguajes trabajen juntos. En este artículo, analizaremos cómo llamar código Objective-C desde Swift: rápido, simple y sin dolor de cabeza.
\n\nEsta pregunta es una de las más populares en Stack Overflow (miles de visitas y cientos de votos). Y con razón: saber integrar Objective-C en Swift abre el acceso a un enorme legado de bibliotecas y código escritos durante décadas de desarrollo de iOS. Finalmente, entendamos cómo funciona.
\n\n¿Qué es el Bridging Header y para qué sirve?
\n\nEl secreto de la amistad entre Swift y Objective-C es un archivo especial llamado Bridging Header (cabecera puente). Es como un traductor: le indica a Swift qué clases y funciones de Objective-C están disponibles y cómo llamarlas correctamente.
\n\nCuando creas un archivo puente, el compilador lo recoge automáticamente y hace visibles todas las declaraciones de Objective-C en Swift. Simplemente importas los encabezados de ObjC en este archivo y listo.
\n\nCómo crear un Bridging Header en Xcode
\n\nLa forma más sencilla es dejar que Xcode lo haga por ti. Simplemente agrega un nuevo archivo Objective-C a tu proyecto (File → New → File → Objective-C File). Xcode preguntará: "¿Quieres crear un Bridging Header?" — responde "Sí". Después de eso, aparecerá en el proyecto un archivo con el nombre YourProjectName-Bridging-Header.h.
Si ya estás trabajando en un proyecto y quieres agregar el puente manualmente, haz lo siguiente:
\n\n- \n
- Crea un nuevo archivo de encabezado (File → New → File → Header File) y nómbralo, por ejemplo,
MyProject-Bridging-Header.h. \n - En la configuración del proyecto (Build Settings), busca el parámetro Objective-C Bridging Header e indica la ruta a tu archivo. \n
Listo. Ahora, todo lo que escribas en este archivo estará disponible en Swift.
\n\nEscribimos una clase Objective-C y la conectamos a Swift
\n\nVamos a crear una clase simple en Objective-C que salude al usuario. Primero, el archivo de encabezado (Greeter.h):
// Greeter.h\n#import <Foundation/Foundation.h>\n\n@interface Greeter : NSObject\n\n- (NSString *)greetWithName:(NSString *)name;\n\n@end\n\n\nY ahora, la implementación (Greeter.m):
// Greeter.m\n#import "Greeter.h"\n\n@implementation Greeter\n\n- (NSString *)greetWithName:(NSString *)name {\n return [NSString stringWithFormat:@"¡Hola, %@! Encantado de conocerte.", name];\n}\n\n@end\n\n\nAhora, lo más importante. Abre tu Bridging Header (por ejemplo, MyProject-Bridging-Header.h) y agrega lo siguiente:
// MyProject-Bridging-Header.h\n#import "Greeter.h"\n\n\n¡Listo! Ahora puedes usar la clase Greeter en Swift como si estuviera escrita en Swift:
// ViewController.swift\nimport UIKit\n\nclass ViewController: UIViewController {\n\n override func viewDidLoad() {\n super.viewDidLoad()\n \n let greeter = Greeter()\n let message = greeter.greet(withName: "Alejandro")\n print(message) // Imprimirá: "¡Hola, Alejandro! Encantado de conocerte."\n }\n}\n\n\nObserva: el método greetWithName: en Swift se transforma en greet(withName:). Esta es una adaptación automática de los nombres de métodos de Objective-C al estilo Swift.
Trabajo con frameworks y bibliotecas Objective-C
\n\nA menudo necesitas conectar no tu propio código, sino una biblioteca ya hecha en Objective-C (por ejemplo, una versión antigua de AFNetworking o CocoaLumberjack). Aquí es aún más simple:
\n\n- \n
- Instala la biblioteca mediante CocoaPods, Carthage o SPM. \n
- Importa sus encabezados en tu Bridging Header. \n
- Usa \n