Importando Project-Swift.h para um arquivo de classe Objective-C… não encontrado

128

Eu tenho um projeto que foi iniciado no Objective-C e estou tentando importar algum código Swift nos mesmos arquivos de classe em que escrevi anteriormente o Objective-C.

Consultei os documentos da Apple sobre o uso de Swift e Objective-C no mesmo projeto, bem como perguntas sobre SO como esta, mas ainda não adiantaram: continuo recebendo o erro de arquivo não encontrado após a inserção #import "NewTestApp-Swift.h"( NewTestAppé o nome do produto e módulo).

Aqui está o que eu fiz até agora:

  1. Em Define Modules, selecionado YESpara o aplicativo.
  2. Garantiu que o nome do módulo do produto não tivesse espaço (veja a captura de tela abaixo da pergunta)

Eu tentei usar #import "NewTestApp-Swift.h"dentro ViewController.m, ViewController.he AppDelegate.mmas nenhum deles funcionou.

O que mais estou fazendo incorretamente? Obrigado pela ajuda.


Captura de tela das configurações:

insira a descrição da imagem aqui


Erros que estou encontrando no momento:

insira a descrição da imagem aqui

daspianista
fonte
3
Excluir todos os dados derivados ~/Library/Developer/Xcode/DerivedDatafez o truque para mim.
wzhang84
Aqui está como eu resolvi o problema: stackoverflow.com/a/45338549/8102549
schrulnz

Respostas:

158

Eu estava enfrentando o mesmo problema e não conseguia que meu projeto importasse rapidamente para as classes obj-c. Usando o Xcode 6, (deve funcionar para o Xcode 6+) e conseguiu fazê-lo desta maneira ....

  1. Qualquer classe que você precise acessar no arquivo .h precisa ser uma declaração de encaminhamento como esta

@class MySwiftClass;

  1. SOMENTE no arquivo .m, se o código estiver no mesmo projeto (módulo), será necessário importá-lo com

#import "ProductModuleName-Swift.h"

Link para a documentação da apple sobre ele

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c

bolnad
fonte
3
Obrigado pela resposta. Isso me levou na direção certa. Eu tive o mesmo problema, mas com um protocolo, tive que adicionar o @protocol MySwiftProtocol em vez da importação no meu arquivo de cabeçalho.
Palme
na declaração de encaminhamento de arquivo .h da classe sem importar o arquivo .h fez o truque para mim. Graças
Sikander
1
Observe que, se o nome do seu produto tiver um -caractere, o nome do arquivo de cabeçalho gerado terá que ser convertido em _. por exemplo, se o nome do seu produto for My-App, você importaria My_App-Swift.h.
Dvanoni
1
Encontrei uma nova maneira de encontrar o nome do arquivo de cabeçalho gerado correto: vá para o seu destino -> Configurações de compilação -> Pesquisar palavras-chaveObjective-C Generated Interface Header Name , bingo!
Itachi
2
Eu fiz essas duas coisas e ainda estou vendo o mesmo problema. Você acha que isso tem a ver com o pedido?
ArielSD 16/09/19
83

Se o código Swift estiver dentro de um módulo (como no seu caso):

#import <ProductName/ProductModuleName-Swift.h>

Se o código Swift estiver dentro do projeto (Swift e ObjC mistos):

#import <ProductModuleName-Swift.h>

No seu caso, você deve adicionar esta linha no arquivo * .m:

#import <NewTestApp/NewTestApp-Swift.h>

IMPORTANTE: observe o "<" na declaração de importação

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

ikocel1
fonte
Obrigado por responder @ ikocel1. Infelizmente estes não funcionaram. Eu tentei variações de <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>e por <NewTestApp/ViewController-Swift.h>dentro ViewController.m, mas continuo recebendo o erro "arquivo não encontrado", apesar Cleaningdo projeto todas as vezes após tentar uma combinação. Incluí uma captura de tela no corpo da pergunta, caso isso ajude.
Daspianist # 13/14
Ainda não inseri nenhum código Swift ViewController.m. Eu só tentei importar os cabeçalhos primeiro para tentar aceitar o código Swift. Eu estarei misturando e combinando os códigos Objective-C e Swift ViewController.m.
Daspianist # 13/14
1
Eu não sei se é possível misturar diretamente código objc e código rápido no mesmo arquivo.
IKocel1 13/10
1
Obrigado, acho que essa foi a suposição que eu baseava no documento "Mix and Match" da Apple ... mas acho que não dentro do arquivo real. Obrigado!
Daspianist # 13/14
6
Não entendi por que essa resposta foi aprovada. Sim, está correto seguindo a documentação, mas praticamente não funciona para mim também. Mesmo na pergunta, é óbvio que o usuário usa a sintaxe, conforme recomendado nesta resposta, mas ainda recebe um erro.
Darius Miliauskas
54

Como eu consegui importar o swift para o objetivo-c:

  • Define o módulo definido como SIM (no projeto - não no destino)
  • Nome do módulo do produto definido (no destino - não no projeto)
  • No seu ViewController.m, importe o código swift com:

    #import "MyProductModuleName-Swift.h"
  • Adicione um arquivo rápido ao seu projeto objetivo-c (Arquivo -> Novo -> Swift) e o Xcode criará o cabeçalho de ponte do objetivo-c para o Swift, mas isso é crucial para que ele funcione de outra maneira - aparentemente.

Para a última peça deste quebra-cabeça, graças ao Swiftoverload por me informar sobre realmente adicionar um arquivo Swift via Xcode GUI e não apenas arrastar e soltar arquivos swift existentes no meu projeto para fazê-lo funcionar: http://nikolakirev.com/blog / using-swift-in-objetivo-c-projeto

holm50
fonte
Excelentes notas. Eu acrescentaria que o destino de teste é seu próprio módulo e terá seu próprio cabeçalho chamado "<#TestTargetName #> - Swift.h" e que quaisquer espaços nos nomes de destino serão convertidos em espaços.
Chuck Krutsinger
@ holm51 Desculpe perguntar isso, mas onde está Define Modulee Product Module Name?
matchifang 29/01
traços -no nome serão convertidos em sublinhados _bem
CyberMew
11

Usando o Xcode 8.2.1 e se você olhar em Projeto > Configurações de compilação> Nome do cabeçalho da interface gerada por Objective-C , ele mostra apenas um arquivo de cabeçalho chamado Product -Swift.h

Isso significa que, em vez de importar cada módulo separadamente do arquivo Objective-C .m, usando o arquivo -Swift.h individual, você apenas importa um Produto- Swift.h que agrega todos os módulos Swift.

Encontrei o mesmo problema procurando a maneira tradicional de importar módulos separadamente, mas a versão atual do Xcode e Swift 3 o alterou para usar apenas um cabeçalho para toda a importação de módulos.

petershine
fonte
oi peter, onde você encontra esse arquivo? Ou é gerado automaticamente pelo xcode? Além disso, você precisa configurar seu podfile de maneira diferente por causa dessa alteração?
Rob Norback 31/01
@RobNorback Se não estou errado, basta escrever 'import "Product-Swift.h" no arquivo de cabeçalho / implementação do Obj-C para ver o efeito, sem fazer nada extra. Verifique se as configurações do seu projeto têm todas as configurações ativadas para mixagem Swift e Obj-C. Além disso, ainda não tive um problema com o Podfile. Entre em contato se estiver vendo as coisas de maneira diferente.
Peterhine
Obrigado, passei horas tentando depurar isso, e o problema era que cada um dos módulos do meu projeto estava gerando seu próprio -Swift.harquivo de cabeçalho. Forçar todos eles (eu tenho 5 destinos) a usar um arquivo de cabeçalho comum corrigiu o problema para mim.
Apoorv Khatreja
@ApoorvKhatreja, como você os forçou a fazer isso? Escreveu o nome do arquivo explicitamente?
Amit Raz 2/18
8

Passou uma hora nesse problema. Seguir estas etapas ajudará você a entender o que está faltando:

  1. Abra a preferência do Xcode e navegue até a pasta DerivedData
  2. Procure por "swift.h" no localizador
  3. Se você não encontrar nenhum arquivo project-swift.h, esse arquivo não foi gerado. Você geralmente precisa adicionar @objc a uma de sua classe rápida e criar o aplicativo com sucesso. Somente assim o Xcode gerará esse arquivo
  4. Se você encontrou o arquivo "xxx-swift.h", verifique se a sua declaração de importação contém o nome correto.

Como localizar um arquivo rápido

Jakehao
fonte
Não adicione a mesma resposta a várias perguntas . Responda à melhor e sinalize o restante como duplicado, depois de ganhar reputação suficiente. Se não for uma duplicata, adapte a postagem à pergunta e sinalize a exclusão.
Bhargav Rao
Obrigado por isso! Alterei o nome de exibição do meu aplicativo (não o destino) e o cabeçalho do Swift também mudou o nome. Essa era a única maneira de encontrar o que estava acontecendo.
Lucas P.
Obrigado por postar uma resposta. As capturas de tela e o formulário preciso de pontos imediatamente me fazem voltar para trás + olhou + encerraram minha pesquisa ... problema resolvido!
dklt 12/03
6

Eu estava tendo problemas para importar o Swift para um projeto Objective-C. No final, procurei na pasta Derivied Data para verificar o que o Xcode 7 estava gerando. O nome do arquivo era completamente diferente daquele que eu esperava.

Uma vez que eu tinha o nome do arquivo real, importei isso e o projeto pôde ser construído.

Josh B
fonte
2
Onde esse arquivo está localizado? Eu olho em volta e não poderia encontrar qualquer coisa
Amit Raz
5

-Swift.hdeve ser criado pelo Xcode automaticamente se o código Swift expor uma API via @objcou @objcMembers[About]

Geralmente, um local parece

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Pode ser alterado por

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

Por padrão, o valor é $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

yoAlex5
fonte
2

DEFINE MÓDULOS: SIM e importe "ProjectName-Swift.h" no arquivo .m da classe Obj-C

Isso funcionou para eu acessar as classes Swift no Obj-c.

YSR fan
fonte
3
Mas como importá-lo para o arquivo .h se eu precisar de classe rápida no cabeçalho objc?
Alexander Danilov
1

Tinha enfrentado o mesmo problema com minha equipe quando estava trabalhando no projeto usando o git. Um desenvolvedor não atualizou o Xcode para a última versão (7.3), necessária para a versão mais recente do Swift 2.2. Portanto, o compilador não reconheceu a nova sintaxe Swift e não conseguiu gerar interface para a biblioteca Swift (projectname-swift.h). Verifique se a versão do Xcode é a mais recente!

Artem Loginov
fonte
No meu caso, enfrentei o problema porque havia decidido adiar a migração para o Swift 3 oferecida pelo Xcode. Como resultado, o Xcode não conseguiu criar arquivos de origem Swift e não gerou os cabeçalhos a serem incluídos.
iutinvg
1

Durante o desenvolvimento, pode haver a possibilidade de você ter qualquer classe rápida que não seja completamente implementada, devido à qual pode haver alguns erros de sintaxe. O arquivo de cabeçalho rápido estará disponível para uso somente se todos os arquivos rápidos estiverem livres de erros.

Verifique se não há erros de sintaxe nos arquivos swift e tente importar o cabeçalho swift no arquivo objetivo - c

Gurunath Sripad
fonte
1

Importando o arquivo de cabeçalho, ou seja,

#import "<ProjectName>-Swift.h" 

no arquivo .h gerou um erro, informando:

-Swift.h 'arquivo não encontrado

e a construção falhou.

Em vez disso, use:

#import "<ProjectName>-Swift.h"

dentro do arquivo .m, e mesmo que o mesmo erro apareça, a execução do projeto suprime o erro.

As classes rápidas estão disponíveis no arquivo .m.

Claytog
fonte
1

Eu enfrentei o problema com o nome do projeto (destino). Inclui o símbolo "-". Portanto, a decisão foi a seguinte: se o nome do projeto for "Test-App", o nome da classe importada será "Test_App-Swift.h"

opochtovy
fonte
solução excelente
iOS Lifee
1

Se o nome do seu aplicativo tiver algum caractere especial, use _ para caractere especial.

Por exemplo, se o nome do seu aplicativo for Nome "Test App®"

Em seguida, você pode importar o arquivo swift "Test_App_-Swift.h".

O espaço e ® são substituídos por _ enquanto você importa.

Silversky Technology
fonte
0

Se você tiver vários destinos, certifique-se de criar todas as estruturas

Same7Farouk
fonte
0

Xcode 11

Eu me deparei com esse problema ao criar o Xcode 11. Demorei um pouco para descobrir o que estava errado, mas essencialmente, eu havia alterado a configuração "Nome de exibição" na guia "Geral" do Target em vez de mudar diretamente no Info.plist arquivo através do diretório Guia "Informações" no destino.

Isso resultou no Xcode 11.5 passando por uma reescrita / criação de várias configurações de criação personalizadas totalmente novas e modificando o nome do módulo de aplicativo e do produto .app criado. Nesse caso, o novo nome de exibição também tinha um /caractere de barra ( ), que pode ser o motivo pelo qual não estava sendo construído (consulte a resposta da @Silversky Technology ).

Independentemente disso, resolvi isso desfazendo todas as alterações automáticas do Xcode 11.5 no arquivo do projeto e fazendo manualmente a mesma alteração no nome de exibição do pacote no Info.plistarquivo e tudo funciona perfeitamente.

Eu gostaria que lhe dissesse que estava fazendo coisas assim antes de começar e faz isso sem o seu consentimento.

Beltalowda
fonte
0

Certifique-se de que sua classe rápida tenha a declaração pública e estenda o NSObject:

public class MySwiftClass: NSObject {
    //...
}

A importação deve funcionar com aspas, não entre colchetes, se a classe rápida estiver no mesmo projeto.

Michael Ribbons
fonte
0

se você adicionar um arquivo Swift primeiro, lembre-se de adicionar um arquivo rápido ao seu destino ..., na coluna esquerda

JethroYe
fonte