Objective-C e Swift: dois mundos, um projeto
\n\nVocê programa em Swift, mas tem à sua disposição uma biblioteca escrita em Objective-C, ou um código antigo, mas testado, em ObjC. Situação familiar? Não se preocupe: a Apple forneceu um mecanismo excelente para o trabalho conjunto dessas duas linguagens. Neste artigo, vamos entender como chamar código Objective-C a partir de Swift — de forma rápida, simples e sem dor de cabeça.
\n\nEsta é uma das perguntas mais populares no Stack Overflow (milhares de visualizações e centenas de votos). E não é à toa: saber integrar Objective-C em Swift abre acesso a um enorme legado de bibliotecas e códigos escritos ao longo de décadas de desenvolvimento iOS. Vamos finalmente entender como isso funciona.
\n\nO que é o Bridging Header e para que serve?
\n\nO segredo da amizade entre Swift e Objective-C é um arquivo especial chamado Bridging Header (cabeçalho de ponte). É como um tradutor: ele informa ao Swift quais classes e funções em Objective-C estão disponíveis e como chamá-las corretamente.
\n\nQuando você cria o arquivo de ponte, o compilador o reconhece automaticamente e torna todas as declarações do Objective-C visíveis no Swift. Basta importar os cabeçalhos ObjC neste arquivo — e pronto.
\n\nComo criar um Bridging Header no Xcode
\n\nA maneira mais fácil é deixar o Xcode fazer isso por você. Basta adicionar um novo arquivo Objective-C ao projeto (File → New → File → Objective-C File). O Xcode perguntará: "Deseja criar um Bridging Header?" — responda "Sim". Depois disso, um arquivo chamado YourProjectName-Bridging-Header.h aparecerá no projeto.
Se você já está trabalhando em um projeto e deseja adicionar a ponte manualmente, faça o seguinte:
\n\n- \n
- Crie um novo arquivo de cabeçalho (File → New → File → Header File) e nomeie-o, por exemplo,
MyProject-Bridging-Header.h. \n - Nas configurações do projeto (Build Settings), encontre o parâmetro Objective-C Bridging Header e indique o caminho para o seu arquivo. \n
Pronto. Agora, tudo o que você escrever neste arquivo estará disponível no Swift.
\n\nEscrevendo uma classe Objective-C e conectando-a ao Swift
\n\nVamos criar uma classe simples em Objective-C que cumprimenta o usuário. Primeiro, o arquivo de cabeçalho (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\nE agora, a implementação (Greeter.m):
// Greeter.m\n#import "Greeter.h"\n\n@implementation Greeter\n\n- (NSString *)greetWithName:(NSString *)name {\n return [NSString stringWithFormat:@"Olá, %@! Prazer em conhecê-lo.", name];\n}\n\n@end\n\n\nAgora, o mais importante. Abra seu Bridging Header (por exemplo, MyProject-Bridging-Header.h) e adicione:
// MyProject-Bridging-Header.h\n#import "Greeter.h"\n\n\nPronto! Agora você pode usar a classe Greeter no Swift como se ela tivesse sido escrita em 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: "Alex")\n print(message) // Exibirá: "Olá, Alex! Prazer em conhecê-lo."\n }\n}\n\n\nObserve: o método greetWithName: no Swift é transformado em greet(withName:). Esta é uma adaptação automática dos nomes de métodos do Objective-C para o estilo Swift.
Trabalhando com frameworks e bibliotecas Objective-C
\n\nFrequentemente, você precisará conectar não o seu próprio código, mas uma biblioteca pronta em Objective-C (por exemplo, uma versão antiga do AFNetworking ou CocoaLumberjack). Aqui é ainda mais simples:
\n\n- \n
- Instale a biblioteca via CocoaPods, Carthage ou SPM. \n
- Importe os cabeçalhos dela no seu Bridging Header. \n
- Use