Eu tento integrar o Swift
código no meu aplicativo. Meu aplicativo está gravado Objective-C
e adicionei uma Swift
classe. Eu fiz tudo descrito aqui . Mas o meu problema é que Xcode
não criei o -Swift.h
arquivo, apenas os cabeçalhos de ponte. Então eu criei, mas na verdade está vazio. Posso usar todas as minhas classes de ObjC no Swift, mas não posso fazê-lo vice-versa. Marquei minha aula rápida, @objc
mas não ajudou. O que eu posso fazer agora?
EDIT: A Apple diz: "Ao importar o código Swift para o Objective-C, você depende de um Xcode-generated
arquivo de cabeçalho para expor esses arquivos ao Objective-C. [...] O nome desse cabeçalho é o nome do módulo do seu produto, seguido pela adição de" -Swift.h ”."
Agora, quando quero importar esse arquivo, ocorre um erro:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Aqui está o meu arquivo FBManager.swift:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
fonte
YourProjectName-Swift.h
deve ser um arquivo de cabeçalho mágico que o Xcode cria automaticamente para você durante a compilação (na verdade, você não o verá no navegador do projeto). Tente excluir o que você criou e adicione#import YourProjectName-Swift.h
aos arquivos nos quais deseja usar as classes Swift.myProjectModule
? O-Swift.h
arquivo deve começar com o nome do seu aplicativo. Você tem um arquivo terminando em-Bridging-Header.h
? Você deve. Nesse caso, a primeira parte desse arquivo é o nome do seu projeto. Combine a primeira parte desse nome de arquivo-Swift.h
e é isso que você deve incluir.-Swift.h
possa ser encontrado no meu Mac, e ainda assim posso incluí-lo. Portanto, não se desligue procurando um arquivo desse tipo. Apenas certifique-se de nomeá-lo corretamente.#import <MyProjectName/MyProjectName-Swift.h>
Respostas:
Passei cerca de 4 horas tentando ativar
Swift
no meuXcode
projeto baseado em Objective-C. Meumyproject-Swift.h
arquivo foi criado com sucesso, masXcode
não o viSwift-classes
. Então, decidi criar um novoXcode
projeto baseado em Objc e, finalmente, encontrei a resposta certa! Espero que este post ajude alguém :-)Integração rápida passo a passo para o projeto baseado em Xcode Objc:
*.swift
arquivo (no Xcode) ou adicione-o usando o Finder.Objective-C bridging header
quando o Xcode perguntar sobre isso.Implemente sua classe Swift:
Abra Configurações de compilação e verifique estes parâmetros:
YES
myproject
YES
myproject-Swift.h
$(SRCROOT)/myproject-Bridging-Header.h
Importe o cabeçalho da interface Swift no seu arquivo * .m.
fonte
"myproject-Swift.h"
então parece-me que ele não está funcionando. Aparentemente, esse arquivo não está visível no navegador do projeto.#import "myproject-Swift.h"
.Não crie você mesmo o arquivo de cabeçalho. Exclua o que você criou.
Verifique se as classes do Swift estão marcadas
@objc
ou herdadas de uma classe derivada (direta ou indiretamente)NSObject
.O Xcode não gerará o arquivo se você tiver algum erro de compilador no seu projeto - verifique se o projeto foi compilado corretamente.
fonte
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u
ver se o arquivo foi criado com um nome inesperado como era para mim. :)Permita que o Xcode faça seu trabalho, não adicione / crie o cabeçalho Swift manualmente. Basta adicionar @objc antes da sua classe Swift ex.
Na configuração do seu projeto, pesquise os sinalizadores abaixo e altere-o para SIM (Projeto e Destino)
Em seguida, limpe o projeto e construa uma vez, depois que a compilação for bem-sucedida (provavelmente deve) importar o arquivo de cabeçalho abaixo no arquivo .m de classe-objetivo-c
Boooom!
fonte
Basic
paraAll
na barra superior.Embedded Content Contains Swift
foi alterado paraAlways Embed Swift Standard Libraries
com o Xcode 8: stackoverflow.com/questions/38792650/…Provavelmente também é útil para aqueles com um destino do Framework :
A declaração de importação do arquivo de cabeçalho gerado automaticamente parece um pouco diferente dos destinos do aplicativo. Além das outras coisas mencionadas em outras respostas, use
ao invés de
conforme a documentação da Apple no Mix & Match para destinos de estrutura.
fonte
Verifique se o seu projeto define um módulo e você deu um nome ao módulo. Em seguida, recrie e o Xcode criará o
-Swift.h
arquivo de cabeçalho e você poderá importar.Você pode definir a definição e o nome do módulo nas configurações do seu projeto.
fonte
Detalhes: Projeto Objective-C com código Swift 3 no Xcode 8.1
Tarefas:
AMOSTRA COMPLETA
1. Classe Objective-C que usa o Swift enum
Detectar código Swift no código Objective-C
No meu exemplo, eu uso o SwiftCode.h para detectar o código Swift no Objective-C. Esse arquivo é gerado automaticamente (não criei uma cópia física desse arquivo de cabeçalho em um projeto) e você pode definir apenas o nome desse arquivo:
2. Classe Swift que usa enum Objective-C
Detectar o código Objective-C no código Swift
Você precisa criar um arquivo de cabeçalho de ponte. Quando você adiciona o arquivo Swift no projeto Objective-C, ou o arquivo Objective-C no projeto swift, o Xcode sugere que você crie um cabeçalho de ponte.
Você pode alterar o nome do arquivo do cabeçalho da ponte aqui:
Uso
Resultado
MAIS AMOSTRAS
3. Chame a classe Swift a partir do código Objective-c
Resultado
4. Chame a classe Objective-c a partir do código Swift
Resultado
5. Use a extensão Swift no código Objective-c
6. Use a extensão Objective-c no código swift
fonte
@objcMembers
na frente da classe. Porque a@objc
inferência foi reduzida no Swift 4 para fins de otimização. Por exemplo, uma propriedade dentro de uma classe derivada de NSObject, não inferirá mais @objc por padrão (como ocorreu no Swift 3). Eu recebi esta informação desta resposta .Eu tive o mesmo problema e os símbolos especiais no nome do módulo foram substituídos por xcode (no meu caso, os traços acabaram sendo sublinhados). Nas configurações do projeto, verifique "nome do módulo" para encontrar o nome do módulo para o seu projeto. Depois disso, use
ModuleName-Swift.h
ou renomeie o módulo nas configurações.fonte
O arquivo é criado automaticamente (falando sobre o Xcode 6.3.2 aqui). Mas você não o verá, pois está na pasta Dados derivados. Depois de marcar sua classe rápida com
@objc
, compile e pesquiseSwift.h
na sua pasta Dados Derivados. Você deve encontrar o cabeçalho Swift lá.Eu tive o problema, que o Xcode renomeou meu
my-Project-Swift.h
paramy_Project-Swift.h
Xcode não gosta de"." "-"
símbolos etc. Com o método acima, você pode encontrar o nome do arquivo e importá-lo para uma classe Objective-C.fonte
#import "my_project-Swift.h"
e meu nome real do projeto émy-project
Basta incluir #import "myProject-Swift.h" no arquivo .m ou .h
PS: Você não encontrará "myProject-Swift.h" no inspetor de arquivos que está oculto. Mas é gerado pelo aplicativo automaticamente.
fonte
A resposta @sig é uma das melhores, no entanto, não funcionou para mim no projeto antigo (não é novo!), eu precisava de algumas modificações. Depois de muitas variações, encontrei a receita para mim (usando o XCode 7.2):
O último ponto (5) foi crucial. Coloquei apenas na segunda seção (campo Destinos), o campo Projeto deve ficar vazio: caso contrário, ele não gerou o arquivo "Project-Swift.h" correto para mim (não incluiu métodos rápidos).
fonte
Define Modules
deveria serNo
??Há duas condições,
Portanto, para esse fim, você deve seguir estas etapas:
Vá para Configurações de compilação e execute as etapas abaixo com a pesquisa,
Depois disso, limpe e reconstrua seu projeto.
Use seu arquivo rápido no arquivo c objetivo.
Nesse caso, primeiro escreva "@objc" antes da sua aula em um arquivo rápido.
Depois disso, no seu arquivo objetivo, escreva isto,
Use seu arquivo objetivo c em um arquivo rápido.
Nesse caso, no seu arquivo de cabeçalho, escreva isso,
Eu espero que isso te ajude.
fonte
Para o Swift 5:
@objc
palavra-chave à sua classe e métodospublic
palavras-chave à sua classe e métodosNSObject
Coloque
#import "MyProject-Swift.h"
no seu arquivo Objective-Cfonte
No meu caso, além destas etapas:
Eu precisei colocar a classe como pública para criar o arquivo productName-Swift.h :
fonte
Acabei de descobrir que adicionar um diretório de arquivos rápidos a um projeto não funcionará. Você precisa criar um grupo primeiro para o diretório e adicionar os arquivos rápidos ...
fonte
Eu tive o mesmo problema e, finalmente, parecia que eles não estavam ligados aos mesmos alvos. A classe ObjC é anexada ao Target1 e Target2, a classe Swift é anexada apenas ao Target1 e não é visível dentro da classe ObjC.
Espero que isso ajude alguém.
fonte
meu problema foi que fiquei preso após o xcode criar o arquivo de ponte, mas ainda assim recebi um erro no nome do arquivo de cabeçalho MYPROJECTNAME-swift.h
1.Eu faço check-in no terminal e procuro todos os arquivos de ponte rápida criados automaticamente:
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
você vê o que o xcode criou.
fonte
Ao adicionar novos arquivos Swift ao projeto, certifique-se de adicioná-los para corrigir as metas. Certifique-se de que todo arquivo rápido que você usará herda a classe NSObject e faça anotações com @ObjCMembers Change to YES dentro das configurações de compilação na opção ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Mude para YES dentro das configurações de compilação na opção DEFINES_MODULE.
fonte
Eu tenho o mesmo erro:
myProjectModule-Swift.h
arquivo não encontrado ", mas, no meu caso, o motivo real estava no destino de implantação errado:"Swift
está indisponível no OS X anterior à 10.9; definaMACOSX_DEPLOYMENT_TARGET
para 10.9 ou posterior (atualmente é '10 .7 ') ". Assim, quando alterei o destino de implantação para 10.9 - o projeto foi compilado com êxito.fonte
Meu problema foi que a geração automática do arquivo -swift.h não conseguiu entender uma subclasse de CustomDebugStringConvertible. Mudei de classe para ser uma subclasse de NSObject. Depois disso, o arquivo -swift.h agora incluía a classe corretamente.
fonte
Eu tinha problemas em adicionar as classes ao meu cabeçalho de ponte de objetivo-c e, nos cabeçalhos de objetivo-c importados, eles tentavam importar o cabeçalho rápido. Não gostou disso.
Portanto, em todas as minhas classes object-c que usam swift, mas também são superadas, a chave era garantir que você usasse declarações de classe de encaminhamento nos cabeçalhos e, em seguida, importe o arquivo "* -Swift.h" no arquivo .m.
fonte
Eu não tive que alterar nenhuma configuração na compilação ou adicionar @obj à classe.
Tudo o que eu precisava fazer era criar o cabeçalho da ponte, criado automaticamente quando criei as classes Swift no projeto Objective-c. E então eu apenas tive que fazer
import "Bedtime-Swift.h" <- dentro do arquivo objetivo-c que precisava usar esse arquivo rápido.
fonte
bem, depois de ler todos os comentários e tentar e ler e tentar novamente, consegui incluir classes rápidas no meu projeto Big obj-c. Então, obrigado por toda a ajuda. Queria compartilhar uma dica que me ajudou a entender melhor o processo. Na classe .m, foi para a linha de importação do nome do destino rápido #import "myTargetName-Swift.h" e clicou na chave:
command + clique do mouse -> Ir para definição
Lá você pode ver toda a tradução de swift para obj-c e, assim, você encontrará as várias funções declaradas novamente em obj-c. Espero que esta dica o ajude tanto quanto me ajudou.
fonte
Usando Classes Swift no Objective-C
Se você estiver importando código em um App Target (mistura de Objective-C e Swift em um projeto), use a próxima linha de importação
#import "<#YourProjectName#>-Swift.h"
para expor o código Swift ao código de Objective-C [Misturando código Swift e Objective-C em um projeto]Neste post, descreverei como importar a biblioteca estática Swift para o código Objective-C
Consumidor Objective-C -> biblioteca estática Swift
Xcode versão 10.2.1
Criar biblioteca estática Swift
Siga
Create Swift static library
com as próximas adições:Expor a API Swift. Para usar as funções de Swift do Objective-C [About]
Depois de criar, você deve encontrar um
<product_name>-Swift.h
arquivo que deve estar localizado emDerivedSources
[Arquivo não encontrado]Consumidor Objective-C com biblioteca estática Swift
Drag and drop
o binário no projeto Xcode [About]Link Library
[Símbolos indefinidos] [Link vs Incorporar]Adicionar
Library Search paths
[Biblioteca não encontrada para] [Caminho recursivo]Adicionar
Header Search Paths
[Módulo não encontrado] [Caminho recursivo]Adicione vazio
.swift file
ao projeto Objective-C. [Símbolos indefinidos] Quando o Xcode perguntar, pressione CriarBridging Header
(ele será criadomodule_name-Bridging-Header.h
) e configure um caminho para este arquivo emImportar módulo para o código do cliente Objective-C [Arquivo não encontrado] [module_name]
Mais exemplos aqui
fonte
XCode 11.3.1:
Quando eu quero usar uma classe interna Swift em um código objc, ele não compila o erro "símbolo indefinido" (para incomodar a classe interna e a classe externa), verifiquei o cabeçalho "-swift.h" gerado e as duas classes são há.Depois de tentar por horas, eu converto a classe interna em uma classe normal e ela é compilada.Eu limpo o projeto, excluo a pasta DerivedData e ela é compilada.
fonte
@objc
antes da declaração da classe interna?Depois de fazer tudo acima, eu ainda tenho erros. Meu problema acabou sendo que os arquivos Swift que eu precisava não foram adicionados aos recursos do pacote por algum motivo.
Corrigi isso corrigindo-o em [MyTarget]> Fases de construção> Copiar recursos do pacote, depois cliquei no botão de adição e adicionei os arquivos Swift.
fonte