Como aproveitar suas classes do Objective-C no Swift e vice-versa

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 <Foundation/Foundation.h>

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:

objective-c-bridging

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 <Foundation/Foundation.h>

@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.

Queremos saber sua opinião