Swift para o cabeçalho Objective-C não criado no Xcode 6


242

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.harquivo de cabeçalho que deveria expor as classes Swift marcadas @objcou 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.


5
Sim. É realmente perguntar onde, no XCode IDE, você precisa fazer algo para criar esse Swift-> ObjC, pois isso não acontece "por padrão" ao adicionar o código Swift a um projeto ObjC existente.
David Kristensen

5
@Popeye eu discordo. Nesse caso, se você estivesse editando os arquivos e compilando na linha de comando, não perceberia esse problema. É o IDE que está executando (ou deve executar) em seu nome que está em questão. Isto está provavelmente relacionado com a configuração do projeto, que é definitivamente uma função IDE
gaige

11
@Popeye A partir dos documentos (PDF) : ao importar o código Swift para o Objective-C, você conta com um arquivo de cabeçalho gerado pelo Xcode para expor esses arquivos ao Objective-C. (Meu negrito, itálico da Apple.) Essa é claramente uma pergunta sobre um recurso do Xcode que ajuda você a usar Swift e Objective-C juntos, e todas as três tags são certamente apropriadas.
Caleb

3
Eu o resolvi com a ajuda de gaige e a documentação. E eu não apenas giro a tag: nesse caso, o arquivo de cabeçalho DEVE ser criado por e visível para o XCode. Não foi, produzindo erros.
David Kristensen

3
@Popeye Não há nada errado - copiei a citação diretamente da página 46. Você encontrou uma passagem semelhante, mas diferente, que diz mais ou menos a mesma coisa.
Caleb

Respostas:


165

Agora funciona.

  1. O projeto deve ter um Nome do módulo do produto que não inclua espaços.
  2. Define Module deve ser definido como Yes em Build Settings, em Packaging.

Finalmente funciona. Obrigado a todos pela ajuda :-)


64
Em Build Settingsunder Packaging, my Defines Moduleestá definido como Yese criei um Product Module Namesem espaços. O "* -Swift.h" não é gerado pelo XCode 6. ???
Loozie

25
Uma observação adicional: primeiro tentei definir as propriedades mencionadas no nível de destino, e não funcionou, o arquivo "* -Swift.h" não foi gerado. Funcionou quando eu o defini no nível do projeto.
Marcin

22
Eu também estou tendo o mesmo problema. Eu Defines Moduleconfigurei Yespara projeto e destino, e um Product Module Namedefinido, sem espaços , mas não consigo obter esse arquivo gerado.
Craig Otis

8
Apenas no caso de outras pessoas estarem tão confusas quanto eu ... Eu tive que ter sorte cega aqui e simplesmente importar o cabeçalho, pois não seria preenchido automaticamente.
shawnwall

14
Você não pode importar -swift nos arquivos de cabeçalho (.h) apenas na implementação.
Zirinisp

122

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


2
Isso está correto e ... e se eu precisar usar uma classe Swift em um cabeçalho objc? Eu tentei com a declaração de encaminhamento, também não funciona.
Ixx

2
Whops, desculpe, a declaração de encaminhamento funciona. Esqueci de adicionar um ponto e vírgula: P
Ixx

14
Para futuros pesquisadores: em seus cabeçalhos fazer declaração para a frente, fazendo @class YourSwiftClass na parte superior de seus arquivos .h (em vez de importar o cabeçalho guarda-chuva)
rogueleaderr

4
E se eu precisar usar uma enumeração Swift em um arquivo de cabeçalho?
22415 jokecraige

1
Além disso, se "#import ProductModuleName-Swift.h" estiver em qualquer arquivo de cabeçalho, o arquivo ProductModuleName-Swift.h não será gerado (como no Xcode 7.2), portanto, se ele tiver sido excluído (por exemplo, limpando a compilação pasta), você verá mensagens de erro em todos os lugares em que o arquivo é importado, mesmo para arquivos .m, aumentando a confusão.
Rene29 /

59

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 #importdeclaraçã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 #importe bingo! O cabeçalho foi criado e importado corretamente :)


Graças a isso, é exatamente o que estava me segurando. Depois de corrigir os erros rápidos de compilação, eu estava pronto. (Xcode Versão 6.1.1)
Rick Roberts #

10
Esse é um ótimo ponto e um bom motivo para ativar a configuração "continuar construindo após erros" no Xcode.
Kendall Helmstetter Gelner

Isso é exatamente o meu caso também: falta -Swift-h aconteceu depois mesmas alterações em código fonte rápida
Giorgio Calzolato

3
depois de ver problema da galinha / ovo percebo o meu problema, boa analogia
d0ye

Este problema estava sempre retornando para mim (Xcode10) e eu apenas interpretei o Xcode como buggy. Esta foi a resposta embora
SumakuTension

44

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):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

Vai encontrar. Se nada nessa pasta corresponder, o Xcode não está gerando.

Estou usando o Xcode versão 6.2 (6C86e)


Isso fez por mim. Eu estive pensando que o preenchimento automático perceberá que eu apenas assumi que não estava lá. Ver no diretório esclareceu as coisas.
Will

Às vezes, ver é acreditar. Não consegui fazer as coisas funcionarem até seguir a resposta recomendada e, em seguida, usei essas etapas para encontrar o cabeçalho gerado que, para minha surpresa, foi postfixado com -Swift.he não o nome do meu arquivo Swift atual. Obrigado!
Josh Habdas

Obrigado! Economizei muito tempo
estemendoza

43

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:

#import "My_Project-Swift.h"


12
Se o nome do módulo do seu projeto tiver hífens, eles também deverão ser substituídos por um sublinhado. Portanto, se o nome do seu projeto for "My-Project", use #import "My_Project.h"
Jeff Ames

6
Além disso, se o nome do módulo do projeto começar com um número, ele também deverá ser substituído por um sublinhado. "1st Project" será "_st_Project-Swift.h"
Danation 18/03/2015

31

* A única coisa importante é: *

para usar o "Nome do módulo do produto" definido no destino, seguido por -Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

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 ...


1
Isso é verdade: não há necessidade de "Definir módulo" no Project ou no Target
Giorgio Calzolato

25

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:

#import <FrameworkName/FrameworkName-Swift.h>

2
No Framework, também observo que, para usar as classes Swift, elas devem ser herdadas do NSObject (até o @objc não ajudará) e todos os métodos / propriedades devem ser públicos.
dmitrynikolaev

3
Pelo menos no pré-lançamento atual do XCode 7, até você herdar o NSObject, eles não estarão disponíveis no cabeçalho rápido gerado.
dmitrynikolaev

100% NÃO resolveu o meu problema. CADA solução é "tornar suas aulas públicas". Eu fiz isso. Período. Ainda NÃO revela as classes Swift em projetos que usam a estrutura.
datWooWoo

@lespommes, você deve escrever uma pergunta e colocar um projeto de amostra em algum lugar que mostre o problema, alguém poderia descobrir o que está acontecendo ... Acabei de dar minha resposta como uma solução possível, porque é o erro de visibilidade que eu mais cometi freqüentemente.
Kendall Helmstetter Gelner

2
Ah, sim, sua dica com a importação finalmente fez o truque para mim! Muito obrigado!
Endowzoner

14

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.


Não sei se isso é verdade. Eu não decidi habilitar o 'Defines Module' até bem depois de criar muitos arquivos rápidos e consegui um -Swift.h perfeitamente.
22413 Michael Peterson

Na verdade, estou entristecem denunciar este é exatamente o problema que tive :( Eu tive que excluir meu .swift e re-adicioná-lo, e então tudo funcionou.
coisas mc

2
O que agora? Estou no meio de alterar os códigos Swift e ObjC. Meu Project-Swift.h não está atualizando. Eu até tentei excluir o arquivo de cabeçalho.
precisa

2
Eu tive que escrever este, dev.iachieved.it/iachievedit/?p=980 . A dica para atualizar as configurações de compilação antes de adicionar arquivos Swift foi essencial para mim.
3126 Joe

Isso significa que eu teria que recriar o projeto e adicionar tudo novamente se não fizesse isso? Não importa o que eu faça, não consigo obter o arquivo * -Swift.h a ser gerado.
kgreenek

13

Permita-me compartilhar minhas experiências tentando usar o Swift em um projeto antigo de objc. Eu não tenho que definir Defines modulea YES.

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.

Cabeçalho de ponte ausente

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 umMyApp-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


Sim, por qualquer motivo, meu arquivo ObjC Swift.h foi gerado com cabeçalhos de classe Swift somente depois de adicionar o arquivo de cabeçalho de ponte vazio ao projeto!
Andrew

O mesmo aqui. Meu código Swift não foi importado para o arquivo * -Swift.h gerado até eu adicionar um arquivo de cabeçalho de ponte Objective-C vazio.
Nik

12

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:

#import "Charts/Charts-Swift.h"

Para os módulos que representam os dados do meu projeto.


É possível alterar / personalizar a dica de ferramenta nos gráficos do IOS? se sim, então você pode dar um exemplo?
Amit Chauhan

12

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.harquivo.

Uma maneira de lidar com isso é

  1. Adicione um pré-processador para cada destino que seja o nome do próprio destino (sem espaços). Ex. 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.
  2. Se você estiver usando um arquivo PCH,

Adicione essas linhas no arquivo PCH

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

A vantagem de usar o arquivo PCH é que você não precisa incluir os cabeçalhos em todos os lugares.

  1. Se você não estiver usando um arquivo PCH, adicione essas mesmas linhas em um único cabeçalho e inclua esse cabeçalho sempre que precisar usar as classes swift.

Isso deve funcionar muito bem.


Eu realmente gosto de usar esta solução sobre a importação do cabeçalho diretamente na sua fonte. Eu tenho uma estrutura de projeto complicada, onde o mesmo código fonte está sendo usado por vários destinos / projetos. Isso evita adicionar uma declaração #if #else bagunçada em todo o meu código. Obrigado pela resposta!
Ryan

Isso salvou meu dia. Coloquei as 5 linhas de código em um arquivo "Something-Swift-Headers.h" (com includeele). 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.
precisa saber é

Isso está errado em muitos níveis. Em primeiro lugar, os .pcharquivos 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!
Iulian Onofrei 04/11

10

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: -

Por padrão, o cabeçalho gerado contém interfaces para declarações Swift marcadas com o modificador público. Ele também contém os marcados com o modificador interno se o destino do seu aplicativo tiver um cabeçalho de ponte Objective-C.


Sim, isso realmente ajudou. Eu não sabia disso. Eu pensei que era apenas necessário para o caso de uso do Obj-C da Swift.
Nodepond

Feliz por ajudar. Eu editei a resposta porque, desde então, descobri o motivo desse comportamento.
Echelon

7

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):

#import "{product_module_name}-Swift.h"

(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.

insira a descrição da imagem aqui

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á.


1
Não deveria ser #import?
Iulian Onofrei 04/11

Digamos que o nome do meu projeto seja ABC, então "ABC-Swift.h" deve existir no meu projeto, certo? Não consigo encontrar. Você precisa criá-lo manualmente? Eu não estou criando nenhum arquivo rápido, apenas incluindo uma vagem de cacau que está escrita rapidamente.
Nr5

O cabeçalho de ponte (no seu caso, ABC-Swift.h) não é criado automaticamente. Quando você tenta criar seu primeiro arquivo Swift em um projeto Obj-C, o Xcode normalmente solicita que você adicione um. Você também pode criar um cabeçalho Bridging em seu próprio país, como mostrado aqui (control + f para 'ponte header'): developer.apple.com/library/content/documentation/Swift/...
Brian Sachetta

5

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.


5

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.

----------

insira a descrição da imagem aqui

----------

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.

----------

insira a descrição da imagem aqui

----------

3.Define Module deve ser definido como Yes em Build Settings, em Packaging, no seu projeto, e não no destino!

----------

insira a descrição da imagem aqui

----------

4.Agora, crie um arquivo rápido ou um controlador de exibição, em arquivo-> novoFile->

----------

insira a descrição da imagem aqui

----------

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

----------

insira a descrição da imagem aqui

----------

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!

----------

insira a descrição da imagem aqui

----------

Espero que isto ajude!


>> Você pode clicar com a tecla Command pressionada para ver o arquivo real! Isso é legal
Jagan

4

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.

  1. Comente a instrução #import "ProductModuleName-Swift.h" no seu arquivo de implementação Objective-C
  2. Comente as referências no arquivo de implementação do Objective-C para Swift Classes
  3. Limpar e construir
  4. Resolver todos os erros / avisos
  5. Remova o comentário na instrução #import "ProductModuleName-Swift.h"
  6. Limpar e criar (com êxito ou corrigir os erros restantes, verifique se você não está referenciando nenhuma classe Swift no Objective-C neste momento . Se sim, comente-as temporariamente)
  7. Verifique se "ProductModuleName-Swift.h" é gerado por Cmd -Click no nome da classe da instrução #import "ProductModuleName-Swift.h"
  8. Remova o comentário no código que faz referência às classes Swift no arquivo de implementação Objective-C.
  9. Limpar e criar como normal (o "ProductModuleName-Swift.h" deve ser gerado e o código do Objective-C que faz referência às classes Swift pode ser usado normalmente)

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

<desconhecido>: 0: erro: o cabeçalho de ponte '/Users/Shared/Working/abc/abc-Bridging-Header.h' não existe

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.

configurações de compilação


1
E se o seu projeto for tão grande que comentar todas as referências de código rápido no objetivo c seja impraticável?
Andrew Morris

3

Você precisa importar um cabeçalho nas classes Objective-C, que são:

#import “ProductModuleName-Swift.h”

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".


24
Mas, quando faço isso, recebo um erro de compilação, AppName-Swift.h não existe. Visto que AppName-Bridging-Header.h existe.
David Kristensen

5
@ DavidKristensen: Você conseguiu a solução ?, pois eu fiquei com o mesmo problema #
BaSha

2

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):

#import "Test_Project-Swift.h"

2

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


2

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 :)


Meu problema era que eu também tinha erros no meu código Swift, mas não o conhecia até descomentar o arquivo -Swift.h. Obrigado!
Will

1

Eu encontrei um truque que sempre funciona em mim.

  1. Crie seu #import "ProductModuleName-Swift.h" no arquivo appDelegate.h e no arquivo ProductName-Prefix.pch. Se você não o possui no xcode 6, pode criá-lo dessa maneira. Por que o ProjectName-Prefix.pch não é criado automaticamente no Xcode 6?
  2. Command + shift + k para limpar seu código, se você receber um erro sobre o "ProductModuleName-Swift.h", exclua-o do arquivo appDelegate.h.
  3. Limpe seu código novamente. Agora tudo vai funcionar como um encanto
  4. Se você receber novamente um erro sobre o "ProductModuleName-Swift.h", crie agora novamente no arquivo appDelegate.h e limpe seu código novamente.

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.


1

Encontrei esta solução

  • Criar SwiftBridge.h
  • coloque #import “ProductModuleName-Swift.h”
  • Tornar público esse arquivo .h (importante) Selecione o arquivo -> Em Mostrar o arquivo Inspetor (barra direita) -> Tornar público

Agora você pode

#import "SwiftBridge.h"

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


Não funciona Apenas tentei. A linha #import “ProductModuleName-Swift.h”aparece com um erro no arquivo SwiftBridge.h em vez do arquivo de código Objective-C original.
Supertecnoboff

1

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.

O nome do módulo do produto nas configurações de construção do destino fornece o nome correto do módulo que funcionará para o seu projeto


Se você pode editar em um link para uma captura de tela, eu poderia editar sua resposta para exibi-la para você.
SuperBiasedMan

1

No meu caso, tive que definir o destino de implantação para pelo menos "OS X 10.9" e o -Swift.hcabeç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.


2
Para outras pessoas - procure nas Configurações de compilação do seu destino, obtenha o nome exato "MyProject-Swift.h" - é isso que você precisa incluir como "#include" MyProject-Swift.h "nos arquivos Objc apropriados. A resposta realmente me ajudou - trabalhando para converter um código aberto antigo do ObjectiveC.
David H

0

Se você conseguiu criar um projeto antes, sem problemas relacionados a “ProductModuleName-Swift.h” not founderro, e agora está recebendo esses erros desagradáveis ​​novamente, o motivo pode estar nas alterações recentes.

Para mim, isso foi por .swiftcodificação de arquivo (acidental) incorreta . Revertendo alterações e trazendo as costas manualmente, faz o trabalho.


0

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á.


0

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


0

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á.


0

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.


0

Às vezes, basta desmarcar e definir novamente a associação de destino no arquivo obj-c .m.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.