No Swift, como se chama o código Objective-C?
A Apple mencionou que eles poderiam coexistir em um aplicativo, mas isso significa que seria possível reutilizar tecnicamente as classes antigas feitas no Objective-C enquanto criava novas classes no Swift?
objective-c
swift
David Mulder
fonte
fonte
Respostas:
Usando Classes Objective-C no Swift
Etapa 1: adicionar implementação de Objective-C - .m
Adicione um
.m
arquivo à sua turma e nomeie-oCustomObject.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:Etapa 3: Adicionar cabeçalho Objective-C - .h
Adicione outro
.h
arquivo e nomeie-oCustomObject.h
.Etapa 4: Crie sua classe Objective-C
No
CustomObject.h
No
CustomObject.m
Etapa 5: adicionar classe ao ponte de cabeçalho
Em
YourProject-Bridging-Header.h
:Etapa 6: use seu objeto
Em
SomeSwiftFile.swift
: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-oMySwiftObject.swift
.Em
MySwiftObject.swift
:Etapa 2: Importar arquivos Swift para a classe ObjC
Em
SomeRandomClass.m
: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
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 errodyld: 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 conformidadeNSObjectProtocol
(a maneira mais fácil de fazer isso é herdarNSObject
) ou serenum
marcado@objc
com um valor bruto de algum tipo inteiro comoInt
. Você pode ver o histórico de edição de um exemplo de código Swift 1.x usando@objc
sem essas restrições.fonte
Consulte o guia da Apple sobre o uso de Swift com cacau e Objective-C . Este guia aborda como usar os códigos Objective-C e C da Swift e vice-versa e contém recomendações sobre como converter um projeto ou misturar e combinar as partes Objective-C / C e Swift em um projeto existente.
O compilador gera automaticamente a sintaxe Swift para chamar funções C e métodos Objective-C. Como visto na documentação, este Objective-C:
se transforma neste código Swift:
O Xcode também faz essa tradução rapidamente - você pode usar o Open Quickly ao editar um arquivo Swift e digitar um nome de classe Objective-C, e você será direcionado para uma versão Swift do cabeçalho da classe. (Você também pode obtê-lo clicando cmd em um símbolo da API em um arquivo Swift.) E toda a documentação de referência da API nas bibliotecas de desenvolvedores do iOS 8 e OS X v10.10 (Yosemite) é visível nas Objective-C e Swift formulários (por exemplo
UIView
).fonte
Aqui estão as instruções passo a passo para usar o código Objective-C (neste caso, uma estrutura fornecida por terceiros) em um projeto Swift:
Em etapas simples:
Um prompt é exibido e, em seguida, clique em OK ... Se não aparecer, criamos manualmente como a seguir ... Crie um arquivo de cabeçalho a partir da fonte iOS e atribua o nome ProjectName-Bridging-Header (exemplo: Test -Bridging-Header) e, em seguida, vá para a configuração de compilação no código do compilador Swift -> ponte Objective-C adicione o nome da ponte Objective-C .. (Test / Test-Bridging-Header.h). Sim, está completo.
Opcionalmente, exclua o arquivo Objective-C que você adicionou (nomeado "qualquer coisa" na imagem GIF acima). Você não precisa mais disso.
Abra o arquivo de cabeçalho da ponte - o nome do arquivo está no formato [YourProject] -Bridging-Header.h . Ele inclui um comentário fornecido pelo Xcode. Adicione uma linha de código para o arquivo Objective-C que você deseja incluir , 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 cabeçalho da ponte:
Agora, em qualquer arquivo Swift, você pode usar o código Objective-C existente, na sintaxe Swift (no caso deste exemplo, e você pode chamar os métodos Mixpanel SDK, etc.). Você precisa se familiarizar com a forma como o Xcode converte Objective-C em Swift. O guia da Apple é uma leitura rápida. Ou veja esta resposta para um resumo incompleto.
Exemplo para Mixpanel:
É isso aí!
Nota: Se você remover o arquivo de cabeçalho de ponte do projeto , certifique-se de ir para Configurações de compilação e remova o valor de " Cabeçalho de ponte de objetivo-C " em "Swift Compiler - Generation de código".
fonte
Você pode ler o belo post Swift & Cocoapods . Basicamente, precisamos criar um arquivo de cabeçalho de ponte e colocar todos os cabeçalhos de Objective-C lá. E então precisamos fazer referência a ele em nossas configurações de compilação. Depois disso, podemos usar o código Objective-C.
Veja também o documento da Apple Using Swift with Cocoa e Objective-C também.
fonte
Eu escrevi um projeto simples do Xcode 6 que mostra como misturar códigos C ++, Objective-C e Swift:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
Em particular, o exemplo chama uma função Objective-C e C ++ do Swift .
A chave é criar um cabeçalho compartilhado, Project-Bridging-Header.h, e colocar os cabeçalhos de Objective-C lá.
Faça o download do projeto como um exemplo completo.
fonte
Mais uma coisa que gostaria de acrescentar aqui:
Sou muito grato pela resposta de @ Logan. Ajuda muito a criar um arquivo de ponte e configurações.
Mas depois de executar todas essas etapas, ainda não estou recebendo uma classe Objective-C no Swift.
Usei a
cocoapods
biblioteca e a integrei ao meu projeto. Qual épod "pop"
.Portanto, se você estiver usando pods de Objective-C no Swift, pode haver uma chance de que você não consiga obter
import
as classes no Swift.A coisa simples que você precisa fazer é:
<YOUR-PROJECT>-Bridging-Header
arquivo e#import <ObjC_Framework>
para@import ObjC_Framework
Por exemplo: (biblioteca pop)
Substituir
com
Use
clang import
quando#import
não estiver funcionando.fonte
Citações da documentação :
fonte
Apenas uma observação para quem está tentando adicionar uma biblioteca Objective-C ao Swift: Você deve adicionar -ObjC em Build Settings -> Linking -> Other Linker Flags .
fonte
Depois de criar um cabeçalho Bridging, vá para Build Setting => Search for "Objective-C Bridging Header".
Logo abaixo, você encontrará o arquivo "" Objective-C Generated Interface Header Name "".
Importe esse arquivo no seu controlador de exibição.
Exemplo: No meu caso: "Dauble-Swift.h"
fonte
Clique no menu Novo arquivo e escolha o arquivo, selecione o idioma Objetivo. Naquele momento, ele gera automaticamente um arquivo "Objective-C Bridging Header" que é usado para definir algum nome de classe.
"Objective-C Bridging Header" em "Swift Compiler - Code Generation".
fonte
fonte
Eu adicionei o projeto no github que inclui uma pequena amostra para chamar o código c objetivo da swift.
Chamar a classe ObjectiveC da swift
fonte
No projeto Swift 4.2.1 no Xcode 10.1, você pode adicionar facilmente o arquivo Objective-C. Siga as etapas abaixo para conectar o arquivo Objective-C ao projeto Swift.
Etapa_01: Crie um novo projeto do Xcode usando o idioma Swift:
File
>New
>Project
>objc
.Etapa_02: No projeto Swift, adicione um novo arquivo Objective-C:
File
>New
>File...
>macOS
>Objective-C File
.Etapa_03: Se você adicionar um novo arquivo Objective-C ao projeto Swift na primeira vez, o Xcode perguntará:
Would you like to configure an Objective-C bridging header
?Etapa_04: selecione a opção:
Create Bridging Header
.Etapa_05: Um arquivo correspondente será gerado com um nome:
Objc-Bridging-Header.h
.Etapa_06: Agora, você precisa configurar o caminho do arquivo Bridge no cabeçalho da ponte. No Navegador de projeto, clique no projeto com o nome
objc
e escolha:Build Settings
>Objective-C Bridging Header
>Objc-Bridging-Header.h
.Etapa_07: arraste e solte seu
Objc-Bridging-Header.h
dentro dessa caixa para gerar um caminho de arquivo.Etapa_08: Abra seu
Objc-Bridging-Header.h
arquivo e importe o arquivo Objective-C que você deseja usar no seu arquivo Swift.Aqui está um conteúdo de
SpecialObjcFile.m
:Etapa_09: Agora no seu arquivo Swift, você pode usar uma classe Objective-C:
fonte
Logans resposta do funciona bem, exceto nos últimos casos
Swift 5
, fornece algum erro do compilador. Aqui está a correção para as pessoas que estão trabalhando no Swift 5.Swift 5
fonte
Consumidor rápido, produtor de Objective-C
Adicionar um cabeçalho
.h
e.m
arquivos de implementação - arquivo de classe Cocoa (Objective-C)Por exemplo
MyFileName
configurar cabeçalho de ponte
Quando você vê
Would you like to configure an Objective-C bridging header
clique em - Sim<target_name>-Bridging-Header.h
será gerado automaticamenteAdicionar classe ao cabeçalho de ponte
Em
<target_name>-Bridging-Header.h
adicionar uma linha#import "<MyFileName>.h"
PS Se você deve adicionar arquivos Objective-C existentes ao projeto Swift, adicione
Bridging-Header.h
antecipadamenteConsumidor Objective-C, produtor Swift
Adicione um
<MyFileName>.swift
e estendaNSObject
Importar arquivos Swift para a classe ObjC
Adicione
#import "<#YourProjectName#>-Swift.h"
ao seu arquivo Objective-CMarcar código Swift público [@objc e @objcMembers]
fonte
A Apple forneceu um guia oficial neste documento: como chamar-objetivo-código-c-código-de-swift
Aqui está a parte relevante:
Para importar um conjunto de arquivos Objective-C para o código Swift no mesmo destino de aplicativo, você depende de um arquivo de cabeçalho de ponte Objective-C para expor esses arquivos ao Swift . O Xcode se oferece para criar esse cabeçalho quando você adiciona um arquivo Swift a um aplicativo Objective-C existente ou um arquivo Objective-C a um aplicativo Swift existente.
Se você aceitar, o Xcode cria o arquivo de cabeçalho de ponte junto com o arquivo que você estava criando e o nomeia usando o nome do módulo do produto seguido de "-Bridging-Header.h". Como alternativa, você mesmo pode criar um cabeçalho de ponte escolhendo Arquivo> Novo> Arquivo> [sistema operacional]> Origem> Arquivo de cabeçalho
Edite o cabeçalho da ponte para expor seu código Objective-C ao seu código Swift:
Quaisquer cabeçalhos públicos do Objective-C listados no cabeçalho da ponte são visíveis para o Swift.
fonte
Abordagem bidirecional para usar o objetivo-c objetivo-c
1
2
Agora é bom ir Obrigado
fonte