Usando Classes Objective-C no Swift
Se você tem uma classe existente que gostaria de usar, execute a Etapa 2 e pule para a Etapa 5 . (Em alguns casos, tive que adicionar um explícito #import <Foundation/Foundation.h
a um arquivo Objective-C mais antigo.)
Etapa 1: adicionar implementação de Objective-C - .m
Adicione um .m
arquivo à sua turma e nomeie-o CustomObject.m
.
Etapa 2: adicionar o cabeçalho de ponte
Ao adicionar seu .m
arquivo, você provavelmente receberá um aviso parecido com este:
Clique em Yes !
Se você não viu o prompt ou excluiu acidentalmente o cabeçalho da ponte, adicione um novo .h
arquivo ao seu projeto e nomeie-o <#YourProjectName#>-Bridging-Header.h
.
Em algumas situações, principalmente ao trabalhar com estruturas de Objective-C, você não adiciona uma classe de Objective-C explicitamente e o Xcode não consegue encontrar o vinculador. Nesse caso, crie seu .h
arquivo com o nome mencionado acima e, em seguida, certifique-se de vincular o caminho nas configurações do projeto do seu destino da seguinte maneira:
Nota:
É uma boa prática vincular seu projeto usando a $(SRCROOT)
macro para que, se você mover seu projeto ou trabalhar com outras pessoas usando um repositório remoto, ele ainda funcione. $(SRCROOT)
pode ser considerado o diretório que contém o arquivo .xcodeproj. Pode ser assim:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Etapa 3: Adicionar cabeçalho Objective-C - .h
Adicione outro .h
arquivo e nomeie-o CustomObject.h
.
Etapa 4: Crie sua classe Objective-C
No CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
No CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Etapa 5: adicionar classe ao ponte de cabeçalho
Em YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Etapa 6: use seu objeto
Em SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Não há necessidade de importar explicitamente; é para isso que serve o cabeçalho da ponte.
Usando Classes Swift no Objective-C
Etapa 1: Criar nova classe Swift
Adicione um .swift
arquivo ao seu projeto e nomeie-o MySwiftObject.swift
.
Em MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
Etapa 2: Importar arquivos Swift para a classe ObjC
Em SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
O arquivo: <#YourProjectName#>-Swift.h
já deve ser criado automaticamente no seu projeto, mesmo que você não possa vê-lo.
Etapa 3: use sua classe
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
Notas:
Se a conclusão do código não estiver se comportando como o esperado, tente executar uma compilação rápida ⌘⇧Rpara ajudar o Xcode a encontrar parte do código Objective-C em um contexto Swift e vice-versa.
Se você adicionar um .swift
arquivo a um projeto mais antigo e receber o erro dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, tente reiniciar completamente o Xcode .
Embora originalmente fosse possível usar classes Swift puras (não descendentes de NSObject
) visíveis ao Objective-C usando o @objc
prefixo, isso não é mais possível. Agora, para estar visível no Objective-C, o objeto Swift deve ser uma classe em conformidade NSObjectProtocol
(a maneira mais fácil de fazer isso é herdar NSObject
) ou ser enum
marcado @objc
com um valor bruto de algum tipo inteiro como Int
. Você pode ver o histórico de edição de um exemplo de código Swift 1.x usando @objc
sem essas restrições.