Eu tenho trabalhado recentemente para adicionar o Swift a um projeto existente, para experimentá-lo da maneira do mundo real.
Ao adicionar um arquivo de origem Swift ao projeto, não tenho problemas em obter o "Bridging Header", ou seja, Objective-C para Swift.
Mas o *-Swift.h
arquivo de cabeçalho que deveria expor as classes Swift marcadas @objc
ou subclasses das classes ObjC, não é encontrado em nenhum lugar :-(
Não vejo instruções específicas sobre como realizar o uso da minha nova subclasse, escrita em Swift, no código principal do aplicativo (que ainda é o Objective-C).
O aplicativo de que sou desenvolvedor principal possui uma base de código bastante grande (70.000 linhas), portanto, a transição de uma só vez está fora de questão.
objective-c
xcode
swift
David Kristensen
fonte
fonte
Respostas:
Agora funciona.
Finalmente funciona. Obrigado a todos pela ajuda :-)
fonte
Build Settings
underPackaging
, myDefines Module
está definido comoYes
e criei umProduct Module Name
sem espaços. O "* -Swift.h" não é gerado pelo XCode 6. ???Defines Module
configureiYes
para projeto e destino, e umProduct Module Name
definido, sem espaços , mas não consigo obter esse arquivo gerado.Eu tive um problema semelhante e descobri que você só pode adicionar
#import "ProductModuleName-Swift.h"
para arquivos obj-c .m, não arquivos .h para o cabeçalho do guarda-chuva a ser encontrado
fonte
Eu descobri que tinha que corrigir todos os erros de compilação antes de gerar o arquivo.
O problema para mim era que se tratava de um problema de galinha / ovo, pois eu não vi nenhum erro de construção até ter comentado a
#import
declaração://#import "ProductModuleName-Swift.h"
que revelou vários outros erros no meu código Swift.
Depois de corrigir esses novos erros e obter a criação da fonte com êxito, descomentei o
#import
e bingo! O cabeçalho foi criado e importado corretamente :)fonte
Se você é como eu, provavelmente tem o nome do cabeçalho errado. Depois de sacudir minha cabeça por um tempo, procurei o arquivo em DerivedData e, com certeza, ele está lá. Na minha configuração (usando a pasta de dados derivados padrão, acredito):
Vai encontrar. Se nada nessa pasta corresponder, o Xcode não está gerando.
Estou usando o Xcode versão 6.2 (6C86e)
fonte
-Swift.h
e não o nome do meu arquivo Swift atual. Obrigado!Se o nome do módulo do seu projeto contiver espaços, você deverá substituir os espaços por um sublinhado.
Por exemplo, se o nome do seu projeto for "Meu Projeto", você usaria:
fonte
* A única coisa importante é: *
para usar o "Nome do módulo do produto" definido no destino, seguido por -Swift.h
Não importa se o parâmetro "Define Module" está definido como Yes ou No ou se o projeto "Product Module Name" não está definido.
Lembrete: as classes Swift devem derivar do NSObject ou foram marcadas com o atributo @objc para serem expostas ao ObjectiveC / Foundation || Cacau ...
fonte
Queria acrescentar mais um motivo para você encontrar um problema com isso: estava criando uma estrutura que misturava os códigos Swift e Objective-C. Não pude importar as classes Swift fora da estrutura - verifiquei o arquivo -Swift.h, que estava sendo gerado, mas estava vazio.
O problema acabou sendo muito, muito simples - eu não havia declarado nenhuma das minhas aulas do Swift pública! Assim que adicionei a palavra-chave pública às classes, pude usá-las de classes dentro e fora da estrutura.
Além disso, dentro da estrutura (dentro dos arquivos .m apenas como outra resposta menciona), tive que importar o arquivo -Swift.h como:
fonte
Eu tive o mesmo problema. Parece que você precisa ajustar as configurações (Define Module e Product Module Name) antes de adicionar seu primeiro arquivo Swift.
Se você fizer isso posteriormente, o arquivo "* -Swift.h" não será gerado para este projeto, mesmo se você adicionar outros arquivos Swift ou excluir o arquivo Swift e criar um novo.
fonte
Permita-me compartilhar minhas experiências tentando usar o Swift em um projeto antigo de objc. Eu não tenho que definir
Defines module
aYES
.No meu caso, eu precisava ter certeza de que havia um cabeçalho de ponte objc. Somente o nome do cabeçalho da interface gerada estava presente nas minhas configurações de compilação.
Isso levou à geração de um arquivo MyApp-Swift.h, mas sem nenhum vestígio das minhas classes Swift.
A documentação da Apple diz que você será solicitado a criar um cabeçalho de ponte ao adicionar seu primeiro arquivo rápido. Bem, eu não estava. Eu adicionei manualmente um
MyApp-Bridging-header.h
arquivo e apontei para ele no campo "Objective-C Bridging Header". Isso fez com que meu arquivo MyApp-Swift.h fosse preenchido com minhas classes Swift.Docs: Importando Swift para o Objective-C
fonte
Aqui está outra variação do moduleName-Swift.h não sendo gerado.
Decidi incluir gráficos do IOS no meu projeto, mas não quis misturar as fontes no mesmo diretório, então coloquei a pasta Projeto de gráficos ao lado da pasta do projeto do meu código. Arrastei o projeto Gráficos para a Barra de Navegação do meu projeto e incluí a estrutura na pasta de destino do meu projeto.lista de Binários incorporadosnas configurações Gerais do projeto e defina aopção Código de Swift de Conteúdo Incorporado como Sim naguia Configurações de Compilação do meu projetonaseção Opções de Compilação .
O arquivo moduleName-Swift.h do meu projeto nunca seria gerado, independentemente de outras opções ou configurações sugeridas aqui. Finalmente, usando o método de Lou Z de procurar os arquivos -Swift.h, vi que um arquivo Charts-Swift.h estava sendo gerado profundamente no diretório xcode Build do meu projeto em Charts.framework / Headers /
A solução para usar o pacote Swift do ios-charts de Daniel Gindi sem incluir o código no diretório de origem do meu projeto foi adicionar:
Para os módulos que representam os dados do meu projeto.
fonte
O nome do arquivo é sempre precedido pelo seu nome de destino . É referido como Nome do produto, mas praticamente é o nome do destino. Portanto, se você deseja criar para um novo destino, esteja pronto para esperar o
that_target-Swift.h
arquivo.Uma maneira de lidar com isso é
MY_TARGET=1
. Adicione isso em Configurações do projeto-> Configurações da compilação-> Macros do pré-processador para cada um dos seus destinos.Adicione essas linhas no arquivo PCH
A vantagem de usar o arquivo PCH é que você não precisa incluir os cabeçalhos em todos os lugares.
Isso deve funcionar muito bem.
fonte
include
ele). Em seguida, importo esse novo arquivo de onde preciso. Sou a favor de não colocar isso dentro do PCH ou de qualquer arquivo .h para evitar dependências cíclicas e usar o cabeçalho de conveniência nos arquivos .m..pch
arquivos são altamente desencorajados . Em segundo lugar, o nome do arquivo contém o nome do produto e NÃO o nome do destino. Pode ser coincidência que seja o mesmo, mas usou o nome do produto!Se o Xcode está realmente gerando seu cabeçalho -Swift.h (profundamente dentro de DerivedData), mas não se refere às suas classes Swift, verifique se você também tem um cabeçalho de ponte definido. A maneira como eu li os documentos implicou que eu só precisava disso para ligar para o Objective-C da Swift, mas também parece ser necessário chamar o Swift do Objective-C.
Veja minha resposta: https://stackoverflow.com/a/27972946/337392
EDIT: É por causa de modificadores de acesso público versus interno, como eu finalmente achei explicado nos documentos da Apple: -
fonte
Apoiando o que muitas pessoas têm aqui, mas adicionando uma captura de tela pertinente. Os códigos Swift e Obj-C certamente podem conviver. Não é um jogo de tudo ou nada.
Para acessar os arquivos Swift no seu Objective-C, basta adicionar esta chamada ao seu arquivo Obj-C (no arquivo .m / de implementação):
(Onde {product_module_name} representa o nome do módulo do produto do seu projeto). Em vez de tentar adivinhar o nome do módulo do produto ou descobrir as caixas de canto com espaços e caracteres especiais, basta ir para a guia de configurações de construção no projeto e digitar "nome do módulo do produto" - o inspetor revelará o seu para você. O meu era algo que eu não esperava que fosse. Confira esta captura de tela se estiver confuso.
E para que o código Obj-c funcione no Swift, você só precisa adicionar um arquivo de cabeçalho de ponte e importar os cabeçalhos de Obj-C relevantes para lá.
fonte
#import
?O mais importante é que este arquivo seja invisível !!! Pelo menos está no Xcode6 beta5. Não haverá esse arquivo chamado "YourModule-Swift.h" no seu espaço de trabalho. Apenas verifique se você tem o nome do módulo e define o conjunto de módulos como yes e use-o na sua classe Objective-C.
fonte
Ok, aqui estão todas as coisas que você realmente precisa!
1. Remova todos os arquivos rápidos que você adicionou e compile o código, sem erros.
----------
----------
2. Vá para as configurações de compilação "Projetos" e defina o nome do módulo do produto. O projeto deve ter um Nome do módulo do produto que não inclua espaços.
----------
----------
3.Define Module deve ser definido como Yes em Build Settings, em Packaging, no seu projeto, e não no destino!
----------
----------
4.Agora, crie um arquivo rápido ou um controlador de exibição, em arquivo-> novoFile->
----------
----------
Ele pedirá para criar um cabeçalho de ponte, permita que ele faça um. Se você recusou uma vez, precisará adicionar manualmente um -Bridging-Header.h
5.Adicione @objc no controlador, para informar ao compilador que existe algum arquivo rápido, que precisa ser exposto ao ObjectiveC
----------
----------
6.Construa o projeto e importe #import "-Swift.h" em qualquer um dos controladores objetivoC e ele funcionará! Você pode clicar com a tecla Command pressionada para ver o arquivo real!
----------
----------
Espero que isto ajude!
fonte
Esta resposta aborda o caso de uso em que você já pode ter algum código Objective-C que chama classes Swift e, em seguida, você começa a receber esse erro.
Como corrigir problema
As etapas a seguir resolveram todos os problemas para mim. Li acima alguém mencionando a "galinha e o ovo" e é exatamente esse conceito que me levou a esse procedimento. Esse processo explícito mostra que é necessário remover qualquer código do Objective-C que faz referência às classes Swift até que o cabeçalho seja gerado.
Nota Bene: As respostas sobre a mudança de espaços para sublinhados e o Módulo Define para SIM, conforme indicado acima, ainda se aplicam ao executar esse processo, assim como as regras especificadas no documentação Apple .
Ponte do caminho do cabeçalho
Em um erro, o arquivo ProductModuleName-Bridging-Header.h não foi encontrado durante o processo de compilação. Este fato gerou um erro
Uma inspeção mais detalhada do erro indicava que o arquivo nunca existiria no local descrito porque estava realmente localizado em ( um caminho errado )
'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'. uma pesquisa rápida das configurações de criação do destino / projetos para fazer a correção manualmente e o arquivo abc-Swift.h foi novamente gerado automaticamente.
fonte
Você precisa importar um cabeçalho nas classes Objective-C, que são:
Ele é gerado automaticamente e, na referência, diz "Todos os arquivos Swift no seu destino serão visíveis nos arquivos Objective-C .m que contêm esta declaração de importação".
fonte
Um arquivo real no projeto não é criado ([ProductModuleName] -Swift.h). Cmd + Clique na importação ou a gera on-the-fly (e na memória) para que você possa ver como a ligação é feita, ou abre um arquivo em algum lugar em algum diretório de cache do Xcode, mas não está no diretório do projeto.
Você precisa definir o objeto de projeto do Defines Module (nas Configurações de compilação do destino) como Sim e se o nome do seu módulo tiver espaços ou traços - use _ em todas as importações do arquivo [ProductModuleName] -Swift.h.
Você pode importá-lo em todos os arquivos. He. M nos quais você usa tipos rápidos ou pode importá-lo no .pch.
Portanto, se meu módulo (projeto) for chamado "Projeto de teste", eu o importaria assim, no arquivo .pch do meu projeto (logo ali):
fonte
Apenas um alerta para quem usou "." lá o nome do projeto. O Xcode substituirá o "." com um sublinhado "_" para a versão Swift do arquivo de cabeçalho da ponte. Curiosamente, o Bridging-Header.h gerado não substitui os períodos por sublinhados.
Por exemplo, um projeto com o nome My.Project teria os seguintes nomes de arquivo do Bridging Header.
Bridging-Header.h (gerado automaticamente)
My.Project-Bridging-Header.h
Swift.h
My_Project.h
Espero que isso ajude quem usou um período e ficou preso como eu. Este arquivo pode ser encontrado no seguinte local.
Macintosh HD / Users / user /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources
Cuidar,
Jon
fonte
O projeto deve ter um Nome do módulo que não inclua espaços. Define Module deve ser definido como Yes em Build Settings, em Packaging. comentou a declaração #import:
Se você ainda está tendo erro ao importar "ProductModuleName-Swift.h", então
// # import "ProductModuleName-Swift.h"
que revelou vários outros erros no meu código Swift.
Depois de corrigir esses novos erros e obter a criação da fonte com êxito, descomentei o #import e o bingo! O cabeçalho foi criado e importado corretamente :)
fonte
Eu encontrei um truque que sempre funciona em mim.
Faça esse trabalho (exclua e crie o "ProductModuleName-Swift.h" do arquivo appDelegate.h e limpe seu código) sempre que receber esse erro para silenciá-lo.
fonte
Encontrei esta solução
Agora você pode
em vez de ProductModuleName-Swift.h
Esta é uma solução alternativa, para a próxima versão do Xcode, acho que esse problema será resolvido. Boa sorte
fonte
#import “ProductModuleName-Swift.h”
aparece com um erro no arquivo SwiftBridge.h em vez do arquivo de código Objective-C original.Eu estava com dificuldade para determinar a importação do nome do módulo / objetivo-c dos cabeçalhos do swift. Também li muitos artigos aqui.
Mas a resposta definitiva para o nome do seu projeto com todos os caracteres especiais incluídos (seja '.' Ou um numérico ou um espaço) - você pode encontrar o texto que funcionará para você no " Nome do módulo do produto ", nas Configurações de compilação do destino. .
Por exemplo, meu nome de destino começou com um numérico - "1mg" e o campo mencionado acima mostrou "_mg" como o nome do meu módulo.
então usei #import "_mg-Swift.h" e funcionou.
fonte
No meu caso, tive que definir o destino de implantação para pelo menos "OS X 10.9" e o
-Swift.h
cabeçalho foi gerado automaticamente. Lembre-se de que você pode receber muitos avisos de descontinuação ao alterar a versão de destino da implantação, especialmente quando possui uma base de código do Objective C muito antiga e muito grande. No nosso caso, também tínhamos muito trabalho a fazer em arquivos XIB e visualizar classes.fonte
Se você conseguiu criar um projeto antes, sem problemas relacionados a
“ProductModuleName-Swift.h” not found
erro, e agora está recebendo esses erros desagradáveis novamente, o motivo pode estar nas alterações recentes.Para mim, isso foi por
.swift
codificação de arquivo (acidental) incorreta . Revertendo alterações e trazendo as costas manualmente, faz o trabalho.fonte
Esse pode ser um ponto óbvio (talvez óbvio demais), mas você deve ter pelo menos um arquivo rápido no projeto para o cabeçalho gerar. Se você estiver escrevendo boilerplate ou código de configuração com a intenção de escrever rapidamente mais tarde, a importação não funcionará.
fonte
Eu tive que excluir o código rápido do WatchOS2 do meu projeto do Objective C. E somente depois que o XCode se ofereceu para gerar -Swift.h
fonte
Eu tive um problema semelhante, mas meu projeto estava compilando antes e de repente recebi um erro após algumas alterações no código dos arquivos. Demorei um pouco para descobrir por que estou recebendo o erro 'Arquivo não encontrado' para o arquivo myproject-swift.h. As alterações de código que eu fiz tiveram alguns erros. O Xcode não apontou esses erros, o tempo todo, mostrando o 'Arquivo não encontrado'. Então peguei a cópia do código da versão anterior e eu comparei com o novo código e o arquivo mesclado, um por um. Após a mesclagem de cada arquivo, o projeto foi encontrado para encontrar o erro. Portanto, a questão é que, se você tiver um erro no seu código, o Xcode pode apenas exibir 'erro de arquivo não encontrado' para o arquivo myproject-swift.h. Provavelmente você tem um erro de compilação no seu projeto. Limpe esses erros e ele funcionará.
fonte
Se você estiver usando algo como Cocoapods (e trabalhando fora da área de trabalho em vez do projeto), tente abrir o projeto e construí-lo antes de abrir o espaço de trabalho e a construção. YMMV.
fonte
Às vezes, basta desmarcar e definir novamente a associação de destino no arquivo obj-c .m.
fonte