Não é possível usar as classes Swift no Objective-C

260

Eu tento integrar o Swiftcódigo no meu aplicativo. Meu aplicativo está gravado Objective-Ce adicionei uma Swiftclasse. Eu fiz tudo descrito aqui . Mas o meu problema é que Xcodenão criei o -Swift.harquivo, apenas os cabeçalhos de ponte. Então eu criei, mas na verdade está vazio. Posso usar todas as minhas classes de ObjC no Swift, mas não posso fazê-lo vice-versa. Marquei minha aula rápida, @objcmas não ajudou. O que eu posso fazer agora?

EDIT: A Apple diz: "Ao importar o código Swift para o Objective-C, você depende de um Xcode-generatedarquivo de cabeçalho para expor esses arquivos ao Objective-C. [...] O nome desse cabeçalho é o nome do módulo do seu produto, seguido pela adição de" -Swift.h ”."

Agora, quando quero importar esse arquivo, ocorre um erro:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

Aqui está o meu arquivo FBManager.swift:

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}
dnnagy
fonte
27
YourProjectName-Swift.hdeve ser um arquivo de cabeçalho mágico que o Xcode cria automaticamente para você durante a compilação (na verdade, você não o verá no navegador do projeto). Tente excluir o que você criou e adicione #import YourProjectName-Swift.haos arquivos nos quais deseja usar as classes Swift.
Greg
3
Seu aplicativo que você está construindo é chamado myProjectModule? O -Swift.harquivo deve começar com o nome do seu aplicativo. Você tem um arquivo terminando em -Bridging-Header.h? Você deve. Nesse caso, a primeira parte desse arquivo é o nome do seu projeto. Combine a primeira parte desse nome de arquivo -Swift.he é isso que você deve incluir.
vacawama
4
Eu tenho isso trabalhando com sucesso no meu projeto, e ainda não há nenhum arquivo real que -Swift.hpossa ser encontrado no meu Mac, e ainda assim posso incluí-lo. Portanto, não se desligue procurando um arquivo desse tipo. Apenas certifique-se de nomeá-lo corretamente.
vacawama
2
@vacawama Observe que você pode ver o conteúdo depois de adicionar a instrução de importação a um arquivo Objective-C clicando com a tecla Command pressionada na importação como se estivesse visitando outro arquivo de cabeçalho.
Kendall Helmstetter Gelner
4
Eu tive que usar#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

Respostas:

516

Passei cerca de 4 horas tentando ativar Swiftno meu Xcodeprojeto baseado em Objective-C. Meu myproject-Swift.harquivo foi criado com sucesso, mas Xcodenão o vi Swift-classes. Então, decidi criar um novo Xcodeprojeto baseado em Objc e, finalmente, encontrei a resposta certa! Espero que este post ajude alguém :-)

Integração rápida passo a passo para o projeto baseado em Xcode Objc:

  1. Crie um novo *.swiftarquivo (no Xcode) ou adicione-o usando o Finder.
  2. Crie um Objective-C bridging headerquando o Xcode perguntar sobre isso.
  3. Implemente sua classe Swift:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
    
  4. Abra Configurações de compilação e verifique estes parâmetros:

    • Define o módulo: YES

      Copiar e colar o nome do parâmetro em uma barra de pesquisa

    • Nome do módulo do produto: myproject

      Verifique se o nome do módulo do produto não contém caracteres especiais

    • Instale o cabeçalho de compatibilidade do Objective-C: YES

      Depois de adicionar o *.swiftarquivo ao projeto, essa propriedade aparecerá em Configurações de compilação

    • Cabeçalho da interface gerada pelo Objective-C: myproject-Swift.h

      Este cabeçalho é gerado automaticamente pelo Xcode

    • Cabeçalho de ponte Objective-C: $(SRCROOT)/myproject-Bridging-Header.h
  5. Importe o cabeçalho da interface Swift no seu arquivo * .m.

    #import "myproject-Swift.h"

    Não preste atenção a erros e avisos.

  6. Limpe e reconstrua seu projeto do Xcode.
  7. Lucro!
sig
fonte
2
Alguém viu a menção da configuração necessária (pelo menos para mim) na documentação em: developer.apple.com/library/prerelease/ios/documentation/Swift/… na etapa 4 acima? Se é que eu perdi. Obrigado @sig.
Morkrom
2
Meu problema era muito mais simples - não consegui encontrar o arquivo, "myproject-Swift.h"então parece-me que ele não está funcionando. Aparentemente, esse arquivo não está visível no navegador do projeto.
Asaf
6
@Asaf Na verdade, sim, esse arquivo é gerado automaticamente pelo Xcode e localizado no caminho de construção do projeto. Portanto, você pode encontrar esse arquivo manualmente no Finder / Console ou abri-lo diretamente no Xcode usando Cmd + LeftClick em #import "myproject-Swift.h".
Sign
1
Quanto a mim, o número 5 foi suficiente para corrigir o problema!
skywinder
12
Com seus essas 4 horas, você salvou centenas de nossas horas, Thanks a lot :) Salvo na minha favorita;)
Abo3atef
65

Não crie você mesmo o arquivo de cabeçalho. Exclua o que você criou.

Verifique se as classes do Swift estão marcadas @objcou herdadas de uma classe derivada (direta ou indiretamente) NSObject.

O Xcode não gerará o arquivo se você tiver algum erro de compilador no seu projeto - verifique se o projeto foi compilado corretamente.

Conta
fonte
8
ser capaz de construir era a chave para mim. Não foi possível construir, porque não conseguia encontrar meu arquivo -swift.h, mas não conseguia encontrar meu arquivo -swift.h porque não poderia construir: /
Anders
13
@anders presos nesse ciclo, você pode find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uver se o arquivo foi criado com um nome inesperado como era para mim. :)
CodeReaper
38

Permita que o Xcode faça seu trabalho, não adicione / crie o cabeçalho Swift manualmente. Basta adicionar @objc antes da sua classe Swift ex.

@objc class YourSwiftClassName: UIViewController

Na configuração do seu projeto, pesquise os sinalizadores abaixo e altere-o para SIM (Projeto e Destino)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

Em seguida, limpe o projeto e construa uma vez, depois que a compilação for bem-sucedida (provavelmente deve) importar o arquivo de cabeçalho abaixo no arquivo .m de classe-objetivo-c

#import "YourProjectName-Swift.h" 

Boooom!

Bharat Modi
fonte
1
Obrigado, isso foi fantasticamente simples e resolveu meu problema.
Felipe
Não vejo nenhuma dessas opções nas Configurações de compilação (Xcode 7.3.1). O que devo fazer?
iosdude
1
^ Teve que mudar de Basicpara Allna barra superior.
iosdude
1
Embedded Content Contains Swiftfoi alterado para Always Embed Swift Standard Librariescom o Xcode 8: stackoverflow.com/questions/38792650/…
William Grand
@WilliamGrand Obrigado pela sugestão, atualizou a resposta.
Bharat Modi
28

Provavelmente também é útil para aqueles com um destino do Framework :

A declaração de importação do arquivo de cabeçalho gerado automaticamente parece um pouco diferente dos destinos do aplicativo. Além das outras coisas mencionadas em outras respostas, use

#import <ProductName/ProductModuleName-Swift.h>

ao invés de

#import "ProductModuleName-Swift.h"

conforme a documentação da Apple no Mix & Match para destinos de estrutura.

Jeehut
fonte
1
@dinesharjani Ainda bem que pude ajudar! :)
Jeehut 4/17/17
E os destinos dos pacotes?
Iulian Onofrei 27/07/19
14

Verifique se o seu projeto define um módulo e você deu um nome ao módulo. Em seguida, recrie e o Xcode criará o -Swift.harquivo de cabeçalho e você poderá importar.

Você pode definir a definição e o nome do módulo nas configurações do seu projeto.

Leo Natan
fonte
14

Detalhes: Projeto Objective-C com código Swift 3 no Xcode 8.1

Tarefas:

  1. Use enumeração rápida na classe objetivo-c
  2. Use o enum objetivo-c na classe rápida

AMOSTRA COMPLETA

1. Classe Objective-C que usa o Swift enum

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Detectar código Swift no código Objective-C

No meu exemplo, eu uso o SwiftCode.h para detectar o código Swift no Objective-C. Esse arquivo é gerado automaticamente (não criei uma cópia física desse arquivo de cabeçalho em um projeto) e você pode definir apenas o nome desse arquivo:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Se o compilador não conseguir encontrar o código Swift do arquivo de cabeçalho, tente compilar o projeto.

2. Classe Swift que usa enum Objective-C

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

Detectar o código Objective-C no código Swift

Você precisa criar um arquivo de cabeçalho de ponte. Quando você adiciona o arquivo Swift no projeto Objective-C, ou o arquivo Objective-C no projeto swift, o Xcode sugere que você crie um cabeçalho de ponte.

insira a descrição da imagem aqui

Você pode alterar o nome do arquivo do cabeçalho da ponte aqui:

insira a descrição da imagem aqui

Bridging-Header.h

#import "ObjcClass.h"

Uso

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

Resultado

insira a descrição da imagem aqui


MAIS AMOSTRAS

Etapas completas de integração Objective-c e Swift descritas acima . Agora vou escrever alguns outros exemplos de código.

3. Chame a classe Swift a partir do código Objective-c

Classe rápida

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Código Objective-C (código de chamada)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

Resultado

insira a descrição da imagem aqui

4. Chame a classe Objective-c a partir do código Swift

Classe Objective-C (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Código Swift (código de chamada)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

Resultado

insira a descrição da imagem aqui

5. Use a extensão Swift no código Objective-c

Extensão rápida

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Código Objective-C (código de chamada)

[UIView swiftExtensionFunc];

6. Use a extensão Objective-c no código swift

Extensão Objective-C (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Código Swift (código de chamada)

UIView.objcExtensionFunc()
Vasily Bodnarchuk
fonte
Essas amostras são realmente úteis, obrigado! E quanto ao Swift 4+, precisamos adicionar @objcMembersna frente da classe. Porque a @objcinferência foi reduzida no Swift 4 para fins de otimização. Por exemplo, uma propriedade dentro de uma classe derivada de NSObject, não inferirá mais @objc por padrão (como ocorreu no Swift 3). Eu recebi esta informação desta resposta .
precisa saber é o seguinte
11

Eu tive o mesmo problema e os símbolos especiais no nome do módulo foram substituídos por xcode (no meu caso, os traços acabaram sendo sublinhados). Nas configurações do projeto, verifique "nome do módulo" para encontrar o nome do módulo para o seu projeto. Depois disso, use ModuleName-Swift.hou renomeie o módulo nas configurações.

Max Mikheyenko
fonte
10
Eu sou um idiota. Eu estava adicionando o nome da classe e, em seguida, anexando "-Swift". Acontece que é o nome do "módulo". +1 por me fazer perceber isso.
HotFudgeSunday
2
Outro idiota aqui que pensou que era o nome da classe!
Charlie Martin
9

O arquivo é criado automaticamente (falando sobre o Xcode 6.3.2 aqui). Mas você não o verá, pois está na pasta Dados derivados. Depois de marcar sua classe rápida com @objc, compile e pesquise Swift.hna sua pasta Dados Derivados. Você deve encontrar o cabeçalho Swift lá.

Eu tive o problema, que o Xcode renomeou meu my-Project-Swift.hpara my_Project-Swift.hXcode não gosta de "." "-"símbolos etc. Com o método acima, você pode encontrar o nome do arquivo e importá-lo para uma classe Objective-C.

raio cerebral
fonte
1
Isso também resolveu meu problema. No meu arquivo .m i importar o arquivo como este #import "my_project-Swift.h" e meu nome real do projeto émy-project
Bhavin_m
Atenção, não apenas "." "-" também espaços :(
user1105951
8

Basta incluir #import "myProject-Swift.h" no arquivo .m ou .h

PS: Você não encontrará "myProject-Swift.h" no inspetor de arquivos que está oculto. Mas é gerado pelo aplicativo automaticamente.

Svitlana
fonte
Obrigado pelo aviso, companheiro.
Felipe
Essa resposta me ajudou e salvou meu dia. O importante é que o Xcode está gerando automaticamente e é um arquivo HIDDEN. Eu estava criando "myProject-Swift.h" e não estava funcionando.
#mrade #
5

A resposta @sig é uma das melhores, no entanto, não funcionou para mim no projeto antigo (não é novo!), eu precisava de algumas modificações. Depois de muitas variações, encontrei a receita para mim (usando o XCode 7.2):

  1. Nome do módulo do produto: $ (PRODUCT_NAME: c99extidentifier)
  2. Define o módulo: NÃO
  3. Conteúdo incorporado contém rápida: NÃO
  4. Instalar o cabeçalho de compatibilidade do Objective-C: SIM
  5. Cabeçalho de ponte de objetivo-C: ProjectName-Bridging-Header.h

O último ponto (5) foi crucial. Coloquei apenas na segunda seção (campo Destinos), o campo Projeto deve ficar vazio: insira a descrição da imagem aquicaso contrário, ele não gerou o arquivo "Project-Swift.h" correto para mim (não incluiu métodos rápidos).

Darius Miliauskas
fonte
1
também um link útil: ericasadun.com/2014/08/21/…
Darius Miliauskas
1
Obrigado Obrigado Obrigado Muito obrigado @DariusMiliauskas só conseguiu funcionar com o seu link
a4arpan
1
@DariusMiliauskasthanks muito! a 5 pontos problema também resolvido para mim no projeto Xcode velho
tatiana_c
Define Modulesdeveria ser No??
Sunil Chauhan
@ SunilChauhan, Sim, é usado apenas para framewoks .
Iulian Onofrei 4/11
5

Há duas condições,

  • Use seu arquivo rápido no arquivo c objetivo.
  • Use seu arquivo objetivo c em um arquivo rápido.

Portanto, para esse fim, você deve seguir estas etapas:

  • Adicione seu arquivo rápido em um projeto objetivo-c ou vice-versa.
  • Crie um arquivo de cabeçalho (.h).
  • Vá para Configurações de compilação e execute as etapas abaixo com a pesquisa,

    1. procure este texto "brid" e defina um caminho para o seu arquivo de cabeçalho.
    2. "Define Module": SIM.
    3. "Sempre incorpore bibliotecas padrão do Swift": SIM.
    4. "Instalar cabeçalho de compatibilidade do Objective-C": SIM.

Depois disso, limpe e reconstrua seu projeto.

Use seu arquivo rápido no arquivo c objetivo.

Nesse caso, primeiro escreva "@objc" antes da sua aula em um arquivo rápido.

Depois disso, no seu arquivo objetivo, escreva isto,

  #import "YourProjectName-Swift.h"

Use seu arquivo objetivo c em um arquivo rápido.

Nesse caso, no seu arquivo de cabeçalho, escreva isso,

  #import "YourObjective-c_FileName.h"

Eu espero que isso te ajude.

vikas prajapati
fonte
4

Para o Swift 5:

  1. Adicione a @objcpalavra-chave à sua classe e métodos
  2. Adicione publicpalavras-chave à sua classe e métodos
  3. Deixe sua classe herdar de NSObject
  4. Projeto de Compilação
  5. Coloque #import "MyProject-Swift.h"no seu arquivo Objective-C

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }
Nico S.
fonte
"Adicione a palavra-chave @objc à sua classe e métodos" - o mesmo para Swift 4
Krzysztof Skrzynecki
3

No meu caso, além destas etapas:

  1. Nome do módulo do produto: myproject
  2. Define o módulo: SIM
  3. Conteúdo incorporado contém rápida: SIM
  4. Instalar o cabeçalho de compatibilidade do Objective-C: SIM
  5. Cabeçalho de ponte Objective-C: $ (SRCROOT) /Sources/SwiftBridging.h

Eu precisei colocar a classe como pública para criar o arquivo productName-Swift.h :

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }
93sauu
fonte
2

Acabei de descobrir que adicionar um diretório de arquivos rápidos a um projeto não funcionará. Você precisa criar um grupo primeiro para o diretório e adicionar os arquivos rápidos ...

Darren Ehlers
fonte
@ <classe específica>; deve ser definido e, em seguida, o projeto usando verá esses arquivos.
Nikita
2

Eu tive o mesmo problema e, finalmente, parecia que eles não estavam ligados aos mesmos alvos. A classe ObjC é anexada ao Target1 e Target2, a classe Swift é anexada apenas ao Target1 e não é visível dentro da classe ObjC.

Espero que isso ajude alguém.

Dani.Rangelov
fonte
Eu ignorei completamente isso com diferentes alvos para preparação e produção. Obrigado pela sua resposta!
Benjamin Martin
O que significa "anexado"?
Iulian Onofrei 27/07/19
"attached" = "members", eles devem ser listados como membros de destino
Dani.Rangelov 30/07/19
1

meu problema foi que fiquei preso após o xcode criar o arquivo de ponte, mas ainda assim recebi um erro no nome do arquivo de cabeçalho MYPROJECTNAME-swift.h

1.Eu faço check-in no terminal e procuro todos os arquivos de ponte rápida criados automaticamente:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

você vê o que o xcode criou.

  1. no meu caso, eu tinha espaço no nome do meu projeto e xcode substitui este é '_'
user1105951
fonte
1

Ao adicionar novos arquivos Swift ao projeto, certifique-se de adicioná-los para corrigir as metas. Certifique-se de que todo arquivo rápido que você usará herda a classe NSObject e faça anotações com @ObjCMembers Change to YES dentro das configurações de compilação na opção ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Mude para YES dentro das configurações de compilação na opção DEFINES_MODULE.

Boris
fonte
0

Eu tenho o mesmo erro: myProjectModule-Swift.harquivo não encontrado ", mas, no meu caso, o motivo real estava no destino de implantação errado:" Swiftestá indisponível no OS X anterior à 10.9; defina MACOSX_DEPLOYMENT_TARGETpara 10.9 ou posterior (atualmente é '10 .7 ') ". Assim, quando alterei o destino de implantação para 10.9 - o projeto foi compilado com êxito.

eslavo
fonte
0

Meu problema foi que a geração automática do arquivo -swift.h não conseguiu entender uma subclasse de CustomDebugStringConvertible. Mudei de classe para ser uma subclasse de NSObject. Depois disso, o arquivo -swift.h agora incluía a classe corretamente.

Justin Domnitz
fonte
0

Eu tinha problemas em adicionar as classes ao meu cabeçalho de ponte de objetivo-c e, nos cabeçalhos de objetivo-c importados, eles tentavam importar o cabeçalho rápido. Não gostou disso.

Portanto, em todas as minhas classes object-c que usam swift, mas também são superadas, a chave era garantir que você usasse declarações de classe de encaminhamento nos cabeçalhos e, em seguida, importe o arquivo "* -Swift.h" no arquivo .m.

ferradura7
fonte
0

Eu não tive que alterar nenhuma configuração na compilação ou adicionar @obj à classe.

Tudo o que eu precisava fazer era criar o cabeçalho da ponte, criado automaticamente quando criei as classes Swift no projeto Objective-c. E então eu apenas tive que fazer

import "Bedtime-Swift.h" <- dentro do arquivo objetivo-c que precisava usar esse arquivo rápido.

coolcool1994
fonte
0

bem, depois de ler todos os comentários e tentar e ler e tentar novamente, consegui incluir classes rápidas no meu projeto Big obj-c. Então, obrigado por toda a ajuda. Queria compartilhar uma dica que me ajudou a entender melhor o processo. Na classe .m, foi para a linha de importação do nome do destino rápido #import "myTargetName-Swift.h" e clicou na chave:

command + clique do mouse -> Ir para definição insira a descrição da imagem aqui

Lá você pode ver toda a tradução de swift para obj-c e, assim, você encontrará as várias funções declaradas novamente em obj-c. Espero que esta dica o ajude tanto quanto me ajudou.

Techno Mag
fonte
0

Usando Classes Swift no Objective-C

Se você estiver importando código em um App Target (mistura de Objective-C e Swift em um projeto), use a próxima linha de importação #import "<#YourProjectName#>-Swift.h"para expor o código Swift ao código de Objective-C [Misturando código Swift e Objective-C em um projeto]

Neste post, descreverei como importar a biblioteca estática Swift para o código Objective-C

Consumidor Objective-C -> biblioteca estática Swift

Xcode versão 10.2.1

Criar biblioteca estática Swift

Siga Create Swift static librarycom as próximas adições:

Expor a API Swift. Para usar as funções de Swift do Objective-C [About]

Depois de criar, você deve encontrar um <product_name>-Swift.harquivo que deve estar localizado em DerivedSources [Arquivo não encontrado]

Consumidor Objective-C com biblioteca estática Swift

Drag and dropo binário no projeto Xcode [About]

Link Library[Símbolos indefinidos] [Link vs Incorporar]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Adicionar Library Search paths[Biblioteca não encontrada para] [Caminho recursivo]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Adicionar Header Search Paths[Módulo não encontrado] [Caminho recursivo]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

Adicione vazio .swift fileao projeto Objective-C. [Símbolos indefinidos] Quando o Xcode perguntar, pressione Criar Bridging Header(ele será criado module_name-Bridging-Header.h) e configure um caminho para este arquivo em

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Importar módulo para o código do cliente Objective-C [Arquivo não encontrado] [module_name]

#import "module_name-Swift.h"

Mais exemplos aqui

yoAlex5
fonte
0

XCode 11.3.1:

Quando eu quero usar uma classe interna Swift em um código objc, ele não compila o erro "símbolo indefinido" (para incomodar a classe interna e a classe externa), verifiquei o cabeçalho "-swift.h" gerado e as duas classes são há.

Depois de tentar por horas, eu converto a classe interna em uma classe normal e ela é compilada.

Eu limpo o projeto, excluo a pasta DerivedData e ela é compilada.

Bill Chan
fonte
1
Você tentou adicionar @objcantes da declaração da classe interna?
dnnagy 22/01
obrigado @dnnagy, verifiquei que não é um problema de sintaxe.
Bill Chan
-1

Depois de fazer tudo acima, eu ainda tenho erros. Meu problema acabou sendo que os arquivos Swift que eu precisava não foram adicionados aos recursos do pacote por algum motivo.

Corrigi isso corrigindo-o em [MyTarget]> Fases de construção> Copiar recursos do pacote, depois cliquei no botão de adição e adicionei os arquivos Swift.

onemoreanimal
fonte
Os recursos do pacote de cópias não devem incluir o código-fonte
Bill Chan