Eu escrevi uma biblioteca no Swift e não pude importá-la para o meu projeto atual, escrito em Objective-C.
Existem maneiras de importá-lo?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Eu escrevi uma biblioteca no Swift e não pude importá-la para o meu projeto atual, escrito em Objective-C.
Existem maneiras de importá-lo?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Respostas:
Você precisa importar TargetName-Swift.h
. Observe que é o nome do destino - as outras respostas cometem o erro de usar o nome da classe.
Esse arquivo único é um cabeçalho gerado automaticamente que define as interfaces Objective-C para todas as classes Swift no seu projeto que são anotadas @objc
ou herdadas de NSObject
.
Considerações:
Se o nome do seu destino contiver espaços, substitua-os por sublinhados (por exemplo, My Project
torna-se My_Project-Swift.h
)
Se seu destino for uma estrutura, você precisará importar <TargetName/TargetName-Swift.h>
Verifique se o seu arquivo Swift é membro do destino
Instruções do site da Apple:
Para importar código Swift para o Objective-C da mesma estrutura
Em Configurações de compilação , em Empacotamento , verifique se a configuração Define Module para esse destino da estrutura está definida como Sim . Importe o código Swift desse destino da estrutura para qualquer arquivo Objective-C .m dentro desse destino da estrutura usando esta sintaxe e substituindo os nomes apropriados:
#import "ProductName-Swift.h"
Revisão:
Você pode importar apenas "ProductName-Swift.h" em arquivos .m.
Os arquivos Swift no seu destino estarão visíveis nos arquivos Objective-C .m que contêm esta declaração de importação.
Para evitar referências cíclicas, não importe o Swift para um arquivo de cabeçalho Objective-C. Em vez disso, você pode encaminhar declarar uma classe Swift para usá-la em um cabeçalho Objective-C. Observe que você não pode subclassificar uma classe Swift em Objective-C.
NSObject
!!! você não pode simplesmente declarar um class Blah
rápido e fazê-lo funcionar. precisa serclass Blah : NSObject
Aqui está o que fazer:
Crie um novo projeto no Objective-C
Crie um novo .swift
arquivo
Clique no seu arquivo Xcode Project
Clique em Configurações de compilação
Localize a barra de pesquisa e procure o módulo Defines .
Altere o valor para Sim .
Pesquisar nome do módulo do produto .
Mude o valor para o nome do seu projeto.
No delegado do aplicativo, adicione o seguinte: #import "YourProjectName-Swift.h"
Nota: Sempre que quiser usar seu arquivo Swift, você deve importar a seguinte linha:
#import "YourProjectName-Swift.h"
Defines module
em Build settings
que Yes
é o que fixa as coisas para mim!
YourProjectName
em #import "YourProjectName-Swift.h"
será o nome do projeto a partir do passo 8. útil se o nome do projeto contém caracteres especiais e você não tem certeza de como exatamente você deve formatá-lo.
Vá para criar configurações no arquivo do projeto e procure por "Nome do cabeçalho da interface gerada por Objective-C . O valor dessa propriedade é o nome que você deve incluir.
Se a propriedade "Nome do módulo do produto" (aquela da qual a propriedade acima depende por padrão) variar dependendo de você compilar para teste / depuração / release / etc (como no meu caso), torne essa propriedade independente disso variação, definindo um nome personalizado.
A importação do Swift
arquivo para dentro Objective-c
pode causar esse erro, se não funcionar import
corretamente.
NOTA: Você não precisa importar arquivos Swift externamente, basta importar um arquivo que cuide de arquivos swift.
Quando você criou / copiou o arquivo Swift no projeto Objective-C . Teria criado um cabeçalho de ponte automaticamente.
Verifique Objective-C Generated Interface Header Name
em Targets -> Build Settings
.
Com base no exposto, vou importar KJExpandable-Swift.h
como está.
Seu será TargetName-Swift.h
, Onde TargetName
difere com base no nome do seu projeto ou em outro destino que você possa ter adicionado e executado nele.
Como abaixo do meu objetivo KJExpandable
, éKJExpandable-Swift.h
Primeiro passo:-
Selecione Alvo do projeto -> Configuração da compilação -> Pesquisa ('Definir') -> Definir valor de atualização do módulo Não para Sim
"Define Module": SIM .
"Sempre incorpore bibliotecas padrão do Swift": SIM .
"Instalar cabeçalho de compatibilidade do Objective-C": SIM .
Segundo passo:-
Adicionar classe de arquivo Swift no arquivo de objetivo C ".h", conforme abaixo
#import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end
Importar 'ProjectName (nome do seu projeto) -Swift.h' no arquivo Objective C ".m"
//TestViewController.m
#import "TestViewController.h"
/*import ProjectName-Swift.h file to access Swift file here*/
#import "ProjectName-Swift.h"
Há uma ressalva se você estiver importando o código Swift para seus arquivos Objective-C dentro da mesma estrutura. Você precisa fazer isso especificando o nome da estrutura e os colchetes angulares:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
aqui está a configuração de compilação "Nome do módulo do produto" ( PRODUCT_NAME = MyFramework
).
Simplesmente adicionar #import "MyFramework-Swift.h"
não funcionará. Se você verificar o diretório de produtos criados (antes de #import
adicionar um desses , para ter pelo menos uma compilação bem-sucedida com algum código Swift no destino), ainda deverá ver o arquivo MyFramework-Swift.h
no Headers
diretório
Se você tem um projeto criado no Swift 4 e adicionou arquivos Objective-C, faça o seguinte:
@objcMembers
public class MyModel: NSObject {
var someFlag = false
func doSomething() {
print("doing something")
}
}
Referência: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/
Confira as notas de pré-lançamento sobre Swift e Objective C no mesmo projeto
Você deveria estar importando
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
Portanto, não é o nome da classe como você escreveu, mas o nome do seu módulo de produto e que importa a importação de todos os arquivos rápidos, não apenas de um específico
Pesquise "Nome do cabeçalho da interface gerada pelo Objective-C" nas Configurações de compilação do destino que você está tentando compilar (digamos que seja MyApp-Swift.h
) e importe o valor dessa configuração ( #import "MyApp-Swift.h"
) no arquivo de origem onde você está tentando acessar suas APIs Swift.
O valor padrão para este campo é $(SWIFT_MODULE_NAME)-Swift.h
. Você pode vê-lo se clicar duas vezes no campo de valor da configuração "Nome do cabeçalho da interface gerada por Objective-C".
Além disso, se você tiver traços no nome do módulo (digamos que seja My-App
), $(SWIFT_MODULE_NAME)
todos os traços serão substituídos por sublinhados. Então você terá que adicionar #import "My_App-Swift.h"
.
Se você deseja usar o arquivo Swift na classe Objective-C , então a partir do Xcode 8 você pode seguir as etapas abaixo:
Se você criou o projeto no Objective-C:
Compile-o e se ele irá gerar um erro de vinculador, como: compilado com a versão mais recente da linguagem Swift (3.0) que os arquivos anteriores (2.0) para a arquitetura x86_64 ou armv 7
Faça mais uma alteração no seu
Construir e executar.
Tenha cuidado com traços e sublinhados, eles podem ser misturados e o nome do projeto e o nome do destino não serão os mesmos que SWIFT_MODULE_NAME.
#import <TargetName-Swift.h>
você verá quando você digitar no teclado #import <e depois automaticamente o Xcode o aconselhará.
Encontre o arquivo .PCH dentro do projeto. e adicione #import "YourProjectName-Swift.h"
Isto importará os cabeçalhos da classe. Para que você não precise importar para um arquivo específico.
#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "YourProjectName-Swift.h"
#endif