Como chamar o código Objective-C do Swift

Na nova linguagem Swift da Apple, como se chama o código Objective-C?

A Apple mencionou que eles poderiam coexistir em um aplicativo, mas isso significa que tecnicamente é possível reutilizar classs antigas feitas no Objective-C enquanto se constroem novas classs no Swift?

O raciocínio

O Objective-C é uma linguagem independente de plataforma, enquanto o Swift depende da plataforma. Escrever código não dependente de plataforma (bibliotecas de lógica de negócios) no Swift, portanto, não seria sensato. No entanto, escrever código dependente de plataforma (interface relacionada, por exemplo) estaria perfeitamente bem. Não quer dizer que seria uma boa ideia, no entanto, é definitivamente um interesse.

Usando Classes Objective-C no Swift

** Se você tiver uma turma existente que gostaria de usar, execute a Etapa 2 e pule para a Etapa 5 . (Em alguns casos, tive que adicionar um #import explícito #import a um arquivo Objective-C mais antigo.) **

Etapa 1: Adicionar Implementação do Objective-C - .m

Adicione um arquivo .m à sua class e nomeie-o como CustomObject.m .

Etapa 2: adicionar header de ponte

Ao adicionar seu arquivo .m , você provavelmente será atingido por um prompt semelhante a este:

Digite a descrição da imagem aqui

Clique em SIM !

Se você não viu o prompt, ou acidentalmente excluiu o header da ponte, adicione um novo arquivo .h ao seu projeto e nomeie-o como < #YourProjectName#>-Bridging-Header.h .

Em algumas situações, particularmente quando se trabalha com frameworks Objective-C, você não adiciona uma class Objective-C explicitamente e o Xcode não consegue encontrar o linker. Nesse caso, crie seu arquivo .h chamado como mencionado acima e, em seguida, certifique-se de vincular seu caminho nas configurações do projeto de destino, da seguinte forma:

Digite a descrição da imagem aqui

Nota

É uma boa prática vincular seu projeto usando a macro $(SRCROOT) para que, se você mover seu projeto ou trabalhar nele com outras pessoas usando um repository remoto, ele ainda funcione. $(SRCROOT) pode ser considerado como o diretório que contém seu arquivo .xcodeproj. Pode parecer assim:

 $(SRCROOT)/Folder/Folder/< #YourProjectName#>-Bridging-Header.h 

Etapa 3: Adicionar header Objective-C - .h

Adicione outro arquivo .h e nomeie-o como CustomObject.h .

Passo 4: Construa sua class 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 - (void) someMethod { NSLog(@"SomeMethod Ran"); } @end 

Etapa 5: adicionar class ao header de ponte

Em YourProject-Bridging-Header.h :

 #import "CustomObject.h" 

Etapa 6: use seu object

Em SomeSwiftFile.swift :

 var instanceOfCustomObject: CustomObject = CustomObject() instanceOfCustomObject.someProperty = "Hello World" println(instanceOfCustomObject.someProperty) instanceOfCustomObject.someMethod() 

Não há necessidade de importar explicitamente; é para isso que serve o header de bridging.

Usando classs Swift no Objective-C

Etapa 1: criar nova class Swift

Adicione um arquivo .swift ao seu projeto e nomeie-o como MySwiftObject.swift .

Em MySwiftObject.swift :

 import Foundation class MySwiftObject : NSObject { var someProperty: AnyObject = "Some Initializer Val" init() {} func someFunction(someArg:AnyObject) -> String { var returnVal = "You sent me \(someArg)" return returnVal } } 

Etapa 2: Importar arquivos Swift para a class ObjC

Em SomeRandomClass.m :

 #import "< #YourProjectName#>-Swift.h" 

O arquivo: < #YourProjectName#>-Swift.h já deve ser criado automaticamente em seu projeto, mesmo que você não possa vê-lo.

Etapa 3: use sua turma

 MySwiftObject * myOb = [MySwiftObject new]; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); myOb.someProperty = @"Hello World"; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); NSString * retString = [myOb someFunction:@"Arg"]; NSLog(@"RetString: %@", retString); 

Nota:

1. CodeCompletion não estava se comportando com a mesma precisão que eu gostaria. No meu sistema, executar uma compilation rápida com "cmd + r" pareceu ajudar o Swift a encontrar parte do código Objective-C e vice-versa.

2. Se você adicionar um arquivo .swift a um projeto mais antigo e obter um erro: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib , tente reiniciar completamente o Xcode .

3. Embora fosse originalmente possível usar classs Swift puras em Objective-C usando o prefixo @objc , depois do Swift 2.0, isso não é mais possível. Veja o histórico de edição para obter uma explicação original. Se essa funcionalidade for reativada em futuras versões do Swift, a resposta será atualizada de acordo.

Consulte o guia da Apple sobre como usar o Swift com o Cocoa e o Objective-C . Este guia aborda como usar os códigos Objective-C e C do Swift e vice-versa e tem recomendações sobre como converter um projeto ou misturar e combinar as partes do Objective-C / C e do Swift em um projeto existente.

O compilador gera automaticamente a syntax do Swift para chamar funções C e methods Objective-C. Como visto na documentação, este Objective-C:

 UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; 

se transforma neste código Swift:

 let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped) 

O Xcode também faz esta tradução em tempo real – você pode usar o Open Rapidamente enquanto edita um arquivo Swift e digitar um nome de class Objective-C, e ele o levará para uma versão Swift do header da class. (Você também pode obter isso clicando cmd em um símbolo da API em um arquivo Swift.) E toda a documentação de referência da API nas bibliotecas do desenvolvedor iOS 8 e OS X v10.10 (Yosemite) fica visível em ambos os Objective-C e Swift formulários (por exemplo, UIView ).

Aqui estão instruções passo a passo para usar o código Objective-C (neste caso, uma estrutura fornecida por terceiros) em um projeto Swift:

  1. Adicione qualquer arquivo Objective-C ao seu projeto Swift escolhendo File -> New -> New File -> Objective-C File. Ao salvar, o Xcode perguntará se você deseja adicionar um header de bridging . Escolha ‘ Sim ‘. Gif: adicionando arquivo vazio para projetar e gerando o header de bridging http://www.derrrick.com/stackoverflow/1-empty-file.gif

Em passos simples:

  1. Um prompt aparece e, em seguida, clique em OK … Se não aparecer, vamos criá-lo manualmente como a seguir … Crie um arquivo de header da fonte iOS e forneça o nome ProjectName-Bridging-Header (exemplo: Teste -Bridging-Header) e, em seguida, vá para construir configuração no código do compilador Swift -> ponte Objective-C adicionar o nome da ponte Objective-C .. (Test / Test-Bridging-Header.h). Sim, está completo

  2. Opcionalmente, exclua o arquivo Objective-C que você adicionou (chamado “qualquer coisa” na imagem GIF acima). Você não precisa mais.

  3. Abra o arquivo de header de bridging – o nome do arquivo está no formato [YourProject] -Bridging-Header.h . Inclui um comentário fornecido pelo Xcode. Adicione uma linha de código para o arquivo Objective-C que você deseja include , como uma estrutura de terceiros. Por exemplo, para adicionar o Mixpanel ao seu projeto, você precisará adicionar a seguinte linha de código ao arquivo de header de ponte:

      #import "Mixpanel.h" 
  4. Agora, em qualquer arquivo do Swift, você pode usar o código Objective-C existente, na syntax do Swift (no caso deste exemplo, e você pode chamar os methods do SDK do Mixpanel, etc.). Você precisa se familiarizar com a forma como o Xcode traduz o Objective-C para o Swift. O guia da Apple é uma leitura rápida. Ou veja esta resposta para um resumo incompleto.

Exemplo para o Mixpanel:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { Mixpanel.sharedInstanceWithToken("your-token") return true } 

É isso aí!

Nota: Se você remover o arquivo de header de ponte de seu projeto , certifique-se de entrar em Configurações de Compilação e remover o valor de ” Cabeçalho de Ponte de Objetivo-C ” em “Compilador Swift – Geração de Código”.

Você pode ler o post agradável Swift & Cocoapods . Basicamente, precisamos criar um arquivo de header de ponte e colocar todos os headers de Objective-C lá. E então precisamos referenciá-lo de nossas configurações de construção. Depois disso, podemos usar o código Objective-C.

 let manager = AFHTTPRequestOperationManager() manager.GET( "http://example.com/resources.json", parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in println("JSON: " + responseObject.description) }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("Error: " + error.localizedDescription) }) 

Também dê uma olhada no documento da Apple Usando Swift com Cocoa e Objective-C também.

Eu escrevi um projeto simples do Xcode 6 que mostra como misturar código C ++, Objective-C e Swift:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

Em particular, o exemplo chama uma function Objective-C e C ++ do Swift .

A chave é criar um header compartilhado, Project-Bridging-Header.he colocar os headers do Objective-C nele.

Por favor, baixe o projeto como um exemplo completo.

Cite a partir da documentação :

Qualquer framework Objective-C (ou biblioteca C) acessível como módulo pode ser importado diretamente para o Swift. Isso inclui todas as estruturas do sistema Objective-C – como Foundation, UIKit e SpriteKit – bem como bibliotecas C comuns fornecidas com o sistema. Por exemplo, para importar o Foundation, basta adicionar essa instrução de importação ao topo do arquivo do Swift em que você está trabalhando:

import Foundation

Essa importação faz com que todas as APIs Foundation – incluindo NSDate, NSURL, NSMutableData e todos os seus methods, propriedades e categorias – estejam disponíveis diretamente no Swift.

Mais uma coisa que gostaria de acrescentar aqui:

Estou muito agradecido pela resposta do @ Logan. Isso ajuda muito a criar um arquivo de ponte e configurações.

Mas depois de fazer todos esses passos eu ainda não estou recebendo uma class Objective-C no Swift.

Eu usei a biblioteca de cocoapods e cocoapods no meu projeto. Qual é o pod "pop" .

Portanto, se estiver usando os pods Objective-C no Swift, pode haver uma chance de que você não consiga obter ou import as classs para o Swift.

A coisa mais simples que você precisa fazer é:

  1. Vá para o arquivo -Bridging-Header e
  2. Substitua a instrução #import para @import ObjC_Framework

Por exemplo: (biblioteca pop)

Substituir

 #import  

com

 @import pop; 

Use a clang import quando o #import não estiver funcionando.

Apenas uma nota para quem está tentando adicionar uma biblioteca Objective-C ao Swift: Você deve adicionar -ObjC em Build Settings -> Linking -> Other Linker Flags .

Depois de criar um header Bridging, vá para Build Setting => Search para “Objective-C Bridging Header”.

Logo abaixo, você encontrará o arquivo “” Nome do header da interface gerada por Objective-C “.

Importe esse arquivo no seu controlador de visualização.

Exemplo: No meu caso: “Dauble-Swift.h”

eEter descrição da imagem aqui

Clique no menu Novo arquivo e escolha o idioma do arquivo selecionado. Objetivo. Nesse momento, ele gera automaticamente um arquivo “Objective-C Bridging Header” que é usado para definir algum nome de class.

“Objective-C Bridging Header” em “Swift Compiler – Code Generation”.

  1. Crie um arquivo .h de NewFile -> Source -> arquivo de header
  2. Em seguida, salve o nome do arquivo Your_Target_Name-Bridging-Header.h As pessoas aqui recebem um erro comum ao pegar o nome do projeto, mas deve ser o nome do alvo do projeto, se no caso ambos forem diferentes, geralmente são iguais.
  3. Em seguida, em configurações de construção, procure por flag Objective-C Bridging Header e coloque o endereço do arquivo de bridging recém-criado, você pode clicar com o botão direito do mouse no arquivo -> show in finder -> arrastar o arquivo na área de texto. ser preenchido.
  4. Usando o #import Your_Objective-C_file.h
  5. No arquivo rápido, você pode acessar o arquivo ObjC, mas apenas em linguagem rápida.

Qualquer framework Objective-C (ou biblioteca C) acessível como módulo pode ser importado diretamente para o Swift. Isso inclui todas as estruturas do sistema Objective-C – como Foundation, UIKit e SpriteKit – bem como bibliotecas C comuns fornecidas com o sistema. Por exemplo, para importar o Foundation, basta adicionar essa instrução de importação ao topo do arquivo do Swift em que você está trabalhando:

 import Foundation 

Essa importação faz com que todas as APIs Foundation – incluindo NSDate, NSURL, NSMutableData e todos os seus methods, propriedades e categorias – estejam disponíveis diretamente no Swift.

Eu peguei isso da documentação da Apple.

Abordagem bidirecional para usar o objective-c objective-c

1

 1. Create bridge-header.h file in Xcode Project 2. import .h file in bridge-Header file 3. Set path of bridge-Header in Build settings. 3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you ) 2. import .h file in bridge-Header file 

Agora é bom ir Obrigado

insira a descrição da imagem aqui Eu adicionei o projeto no github que inclui uma pequena amostra para chamar o código c objective de swift.

Chame a class ObjectiveC de swift

No projeto do Swift 4.2 no Xcode 9.4 você pode facilmente adicionar o arquivo Objective-C. Siga os passos abaixo para ligar o arquivo Objective-C ao projeto Swift.

Step_01: Crie um novo projeto Xcode usando a linguagem Swift:

File > New > Project > objc .

Step_02: No projeto Swift, inclua o novo arquivo Objective-C:

File > New > File... > macOS > Objective-C File .

Passo 03: Se você adicionar um novo arquivo Objective-C no projeto Swift pela primeira vez, o Xcode perguntará a você:

Would you like to configure an Objective-C bridging header ?

insira a descrição da imagem aqui

Passo 04: selecione a opção:

Create Bridging Header .

Step_05: Um arquivo correspondente será gerado com um nome:

Objc-Bridging-Header.h .

insira a descrição da imagem aqui

Passo 06: Agora, você precisa configurar o caminho do arquivo Bridge no header da bridge. No Project Navigator, clique no projeto com o nome objc e escolha:

Build Settings > Objective-C Bridging Header > Objc-Bridging-Header.h .

Step_07: Arraste e solte seu Objc-Bridging-Header.h na checkbox para gerar um caminho de arquivo.

insira a descrição da imagem aqui

Passo 08: Abra seu Objc-Bridging-Header.h e importe o arquivo Objective-C que você deseja usar em seu arquivo Swift.

 #import "SpecialObjcFile.m" 

Aqui está um conteúdo de SpecialObjcFile.m :

 #import  @interface Person: NSObject { @public bool busy; } @property bool busy; @end 

Passo 09: Agora no seu arquivo Swift, você pode usar uma class Objective-C:

 override func viewDidLoad() { super.viewDidLoad() let myObjcContent = Person() print(myObjcContent.busy) } 

insira a descrição da imagem aqui insira a descrição da imagem aqui