Eu quero começar a usar o Swift em meu projeto Objective-C. Então, eu adicionei uma classe rápida:
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
E importou para um arquivo .m:
#import "MyProjectName-Swift.h"
Ao construir meu projeto, recebo o seguinte erro:
Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist
NOTA: Em "Build Settings-> Swift Compiler - Code Generation-> Objective-C Briding Header" é definido como MyProjectName-Bridging-Header.h
O que devo fazer para resolver esse problema?
Qualquer ajuda é muito apreciada.
EDITAR: Arquivo Bridging-Header: #if defined (__ has_include) && __has_include () # include #endif
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif
#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif
#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
# define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#if defined(__has_feature) && __has_feature(modules)
#endif
#pragma clang diagnostic pop
ios
objective-c
xcode
swift
user2408952
fonte
fonte
MyProjectName-Swift.h
eMyProjectName-Bridging-Header.h
trabalhar em direções opostas.MyProjectName-Swift.h
é fornecido automaticamente.MyProjectName-Bridging-Header.h
, no entanto, é fornecido de forma semi-automática, ou seja, você precisa ter certeza de que está lá. Então, você tem certeza que pode verMyProjectName-Bridging-Header.h
no navegador do seu projeto? Caso contrário, crie e adicione um arquivo com esse nome ao seu projeto. Em seguida, verifique novamente se o caminho para ele nas configurações de compilação está correta (que deve incluir o diretório do projeto:MyProjectName/MyProjectName-Bridging-Header.h
.Respostas:
Se o arquivo de ponte for criado no mesmo nível que as outras classes, pode ser necessário adicionar o caminho relativo, como mostram essas imagens. Observe aqui que o arquivo de ponte é criado no mesmo nível que as outras classes:
Eu tenho o nome inserido corretamente nas configurações de compilação,
mas o compilador não encontra o arquivo.
Portanto, se eu adicionar o caminho relativo da raiz do projeto (ou seja, eu adiciono
./ProjectName/BridgerFileName.h
),agora ele compila e posso chamar um método em minha classe Objective C:
fonte
Descobri que, depois de criar o arquivo de cabeçalho de ponte manualmente e escolher o nome e local padrão, o cabeçalho de ponte será colocado no diretório do projeto, que está sob o diretório raiz.
Isso requer o seguinte valor para a configuração: Targets> [Your App Target]> Build Settings> Swift Compiler - Code Generation> Objective-C Bridging Header :
Observe que, se o seu projeto for um módulo (framework) swift, então, conforme apontado nos comentários, você pode preferir:
fonte
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h
será mais comum :)$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h
até minha pasta de projeto estou obtendo o caminho correto, mas anexando/$(PROJECT_NAME)
não me levando ao caminho desejado.Para aqueles que estão removendo o cabeçalho de ponte
Eu estava indo na direção oposta da maioria das outras respostas aqui. Eu estava usando um Bridging Header anteriormente, mas não precisava mais dele. Depois de excluí-lo do meu projeto, comecei a receber o erro mencionado na pergunta. Executei os seguintes passos para resolver meu problema.
fonte
Em Swift 4.1
seu projeto você não tem
bridging-Header.h
arquivo, mas seu projeto tem esse caminho. Para isso, você precisa excluir esse caminho ...Vá para o
targets
arquivo e selecioneBuild Settings
, ---->Swift Compiler - General
e exclua obridging-Header.h
. Siga as capturas de tela abaixo ....Exclua o
bridging-Header.h
arquivo no Compilador Swift - GeralAgora você ficou assim ...
fonte
Para adicionar o arquivo Bridge no projeto Swift.
Etapa 1. Vá para Arquivo> Adicionar Cocoa com o arquivo Objective-C (para fins temporários)
Etapa 2. Em seguida, o seguinte pop-up aparecerá
Agora pressione o botão Criar cabeçalho de ponte
FEITO,
VOCÊ OBTERÁ ARQUIVO BRIGDE EM BUNDLE
AGRADECIMENTOS
fonte
Estas são as etapas para criar o cabeçalho Bridging.
Arquivo-> Novo-> iOS-> Arquivo de cabeçalho , dê o nome do arquivo de ponte como "yourProjectName-Bridging-Header.h"
Build-Settings-> Objective-C Bridging Header , basta dar ao arquivo de cabeçalho de ponte o nome de "ProjectName-Bridging-Header.h"
NOTA: O arquivo de cabeçalho de ponte deve estar localizado na pasta raiz principal do projeto onde o arquivo ".xcodeproj" está localizado. Caso contrário, mova o arquivo de cabeçalho Bridging para a pasta raiz do projeto. Desta forma o Xcode consegue acessar o arquivo de bridge.
Compile o projeto e importe os arquivos necessários no cabeçalho Bridging.
fonte
Para mim, ajudou a usar $ (SRCROOT) / $ (PROJECT_NAME) / na frente do meu caminho de arquivo de cabeçalho de ponte
fonte
Para mim ajudou a usar
$(SRCROOT)
na frente do meu caminho de cabeçalho de ponte Objective-C.fonte
Siga os passos abaixo:
Talvez essas duas coisas ajudem a resolver seu problema.
fonte
O seguinte funcionou para mim:
fonte
Criando arquivo de cabeçalho de ponte manualmente
Antes de mais nada, exclua o arquivo de cabeçalho Bridging que o Xcode foi criado. E selecione seu projeto, vá para> Build Settings> Search the keyword. Compilador Swift - Geração de código. Clique em Objective-C Bridging Header e exclua esse caminho. Agora limpe seu projeto.
Agora selecione seu projeto> Janela na barra de navegação. Selecione Projetos e exclua seus dados derivados de lá.
Agora crie um novo arquivo, selecione a fonte e, em seguida, selecione o arquivo de cabeçalho e crie seu arquivo de cabeçalho de Bridging. O nome do arquivo deve ser seu projectname-Bridging-Header.h e então criá-lo
Selecione seu projeto, vá para> Build Settings> Search the keyword. Compilador Swift - Geração de código. Clique em Objective-C Bridging Header e agora adicione o caminho neste Objective-C Bridging Header como projectname-Bridging-Header.h
Agora importe suas classes para o arquivo de cabeçalho de ponte e você pode compilá-lo em seu código facilmente.
Seu arquivo de cabeçalho de ponte fica assim quando você está criando seu arquivo manualmente.
fonte
O que me ajudou foi mover o arquivo manualmente para o caminho mencionado em uma mensagem de erro. Assim:
fonte