A Apple prometeu continuar dando suporte ao Objective-C no iOS 8. Mas todos nós sabemos que a grande maioria dos desenvolvedores vai preferir trocar para o Swift, a nova linguagem da Apple. Ela é mais rápida, consome menos recursos, é mais fácil de desenvolver e tem um longo futuro pela frente na plataforma.
Mas, se você usou Objective-C por anos, pode ser um pouco difícil migrar de linguagem. Principalmente se você já tem um projeto no meio do caminho.
Felizmente, é possível aproveitar suas classes criadas no Objective-C no Swift. E vice-versa. Vamos aprender como.
A própria Apple tem uma boa documentação sobre o tema . Então, se você tem uma classe existente que gostaria de usar, execute o passo 2 e então pule direto para o passo 5. Em alguns casos, você precisará adicionar explicitamente um arquivo antigo do Objective-C:
#import
1: Adicione uma Implementação do Objective-C (.m)
Adicione um arquivo .m à sua classe, e nomeie como CustomObject.m
2: Adicione um Bridging Header
Ao adicionar seu arquivo .m, você provavelmente verá uma tela similar à imagem abaixo. Clique em Yes:
Se você não passar por esta tela ou acidentalmente deletar seu bridging header, adicone um novo arquivo .h ao seu projeto e nomeio-o como <#SeuNomedeProjeto>-Bridging-Header.h
3: Adicione um Objective-C Header (.h)
Adicione outro arquivo .h e nomeio-o como CustomObject.h
4: Monte sua Classe Objective-C
Em CustomObject.h:
#import@interface CustomObject : NSObject @property (strong, nonatomic) id someProperty; - (void) someMethod; @end
Em CustomObject.m:
#import "CustomObject.h" @implementation CustomObject : NSObject - (void) someMethod { NSLog(@"SomeMethod rodou"); } @end
5: Adicione a Classe ao Bridging-Header
Em SeuNomedeProjeto-Bridging-Header.h:
#import "CustomObject.h"
6: Use Seu Objeto
Em SeuArquivoSwift.swift:
var instanceOfCustomObject: CustomObject = CustomObject() instanceOfCustomObject.someProperty = "Hello World" println(instanceOfCustomObject.someProperty) instanceOfCustomObject.someMethod()
Não há a necessidade de importar explicitamente, é para isso que server o bridging header.
Usando Classes do Swift no Objective-C
E o caminho inverso? Mais fácil ainda, basta seguir os seguintes passos:
1: Crie uma Nova Classe no Swift
Adicione um arquivo .swift ao seu projeto e nomeio-o como MeuObjetoSwift.swift
Em MeuObjetoSwift.swift:
import Foundation class MeuObjetoSwift: NSObject { var someProperty: AnyObject = "Algum valor de inicialização" init() {} func someFunction(someArg:AnyObject) -> String { var returnVal = "Retornou o valor \(someArg)" return returnVal } }
2: Importe Arquivos Swift para uma Classe de Objective-C
Em MinhaClasse.m:
#import "<#NomedoProjeto#>-Swift.h"
O arquivo <#NomedoProjeto#>-Swift.h já deve ter sido criado automaticamente em seu projeto, mesmo que você não esteja visualizando ele.
3: Use Sua Classe
MeuObjetoSwift * myOb = [MeuObjetoSwift new]; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); myOb.someProperty = @"Hello World"; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); NSString * retString = [myOb someFunction:@"Arg"]; NSLog(@"RetString: %@", retString);
Observação: Neste estágio inicial de suporte à linguagem, é possível que o CodeCompletion não se comporte adequadamente. Rode uma montagem rápida com CMD + r para ajudar o Swift a encontrar o código Objective-C e vice-versa.