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:
- Em
Define Modules
, selecionadoYES
para o aplicativo. - 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.h
e AppDelegate.m
mas nenhum deles funcionou.
O que mais estou fazendo incorretamente? Obrigado pela ajuda.
Captura de tela das configurações:
Erros que estou encontrando no momento:
~/Library/Developer/Xcode/DerivedData
fez o truque para mim.Respostas:
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 ....
@class MySwiftClass;
#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
fonte
-
caractere, o nome do arquivo de cabeçalho gerado terá que ser convertido em_
. por exemplo, se o nome do seu produto forMy-App
, você importariaMy_App-Swift.h
.Objective-C Generated Interface Header Name
, bingo!Se o código Swift estiver dentro de um módulo (como no seu caso):
Se o código Swift estiver dentro do projeto (Swift e ObjC mistos):
No seu caso, você deve adicionar esta linha no arquivo * .m:
IMPORTANTE: observe o "<" na declaração de importação
https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
fonte
<NewTestApp-Swift/NewTestApp-Swift.h>
,<NewTestApp/NewTestApp-Swift.h>
e por<NewTestApp/ViewController-Swift.h>
dentroViewController.m
, mas continuo recebendo o erro "arquivo não encontrado", apesarCleaning
do projeto todas as vezes após tentar uma combinação. Incluí uma captura de tela no corpo da pergunta, caso isso ajude.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 SwiftViewController.m
.Como eu consegui importar o swift para o objetivo-c:
No seu ViewController.m, importe o código swift com:
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
fonte
Define Module
eProduct Module Name
?-
no nome serão convertidos em sublinhados_
bemUsando 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.
fonte
-Swift.h
arquivo de cabeçalho. Forçar todos eles (eu tenho 5 destinos) a usar um arquivo de cabeçalho comum corrigiu o problema para mim.Passou uma hora nesse problema. Seguir estas etapas ajudará você a entender o que está faltando:
fonte
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.
fonte
-Swift.h
deve ser criado pelo Xcode automaticamente se o código Swift expor uma API via@objc
ou@objcMembers
[About]Geralmente, um local parece
Pode ser alterado por
Por padrão, o valor é
$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
fonte
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.
fonte
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!
fonte
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
fonte
Importando o arquivo de cabeçalho, ou seja,
no arquivo .h gerou um erro, informando:
e a construção falhou.
Em vez disso, use:
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.
fonte
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"
fonte
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.
fonte
Se você tiver vários destinos, certifique-se de criar todas as estruturas
fonte
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.plist
arquivo 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.
fonte
Certifique-se de que sua classe rápida tenha a declaração pública e estenda o NSObject:
A importação deve funcionar com aspas, não entre colchetes, se a classe rápida estiver no mesmo projeto.
fonte
se você adicionar um arquivo Swift primeiro, lembre-se de adicionar um arquivo rápido ao seu destino ..., na coluna esquerda
fonte