No se pueden usar las clases Swift dentro de Objective-C

260

Intento integrar el Swiftcódigo en mi aplicación. Mi aplicación está escrita Objective-Cy agregué una Swiftclase. He hecho todo lo descrito aquí . Pero mi problema es que Xcodeno ha creado el -Swift.harchivo, solo los encabezados de puente. Así que lo creé, pero en realidad está vacío. Puedo usar todas mis clases de ObjC en Swift, pero no puedo hacerlo al revés. Marqué mi clase rápida con @objcpero no ayudó. ¿Qué puedo hacer ahora?

EDITAR: Apple dice: "Cuando importas el código Swift en Objective-C, confías en un Xcode-generatedarchivo de encabezado para exponer esos archivos a Objective-C. [...] El nombre de este encabezado es el nombre del módulo de tu producto seguido de agregar" -Swift.h ”."

Ahora cuando quiero importar ese archivo, me da un error:

    //MainMenu.m

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

    @implementation MainMenu

Aquí está mi archivo 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
fuente
27
YourProjectName-Swift.hdebe ser un archivo de encabezado mágico que Xcode crea automáticamente para usted durante la compilación (en realidad no lo verá en el navegador del proyecto). Intente eliminar el que creó y agréguelo #import YourProjectName-Swift.ha los archivos en los que desea usar las clases Swift.
Greg
3
¿Se llama su aplicación que está creando myProjectModule? El -Swift.harchivo debe comenzar con el nombre de su aplicación. ¿Tiene un archivo que termina en -Bridging-Header.h? Debieras. Si es así, la primera parte de ese archivo es el nombre de su proyecto. Combina la primera parte de ese nombre de archivo -Swift.hy eso es lo que deberías incluir.
vacawama
44
Tengo esto funcionando con éxito en mi proyecto y, sin embargo, no hay un archivo real que termine en -Swift.hmi Mac, y aún así puedo incluirlo. Así que no te obsesiones buscando un archivo así. Solo asegúrese de nombrarlo correctamente.
vacawama
2
@vacawama Tenga en cuenta que puede ver el contenido después de agregar la declaración de importación a un archivo Objective-C haciendo clic en Command en la importación como si estuviera visitando cualquier otro archivo de encabezado.
Kendall Helmstetter Gelner
44
Tuve que usar#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

Respuestas:

516

Pasé unas 4 horas tratando de habilitar Swiften mi Xcodeproyecto basado en Objective-C. Mi myproject-Swift.harchivo se creó con éxito, pero mi Xcodeno vio mi Swift-classes. Entonces, decidí crear un nuevo Xcodeproyecto basado en Objc y finalmente, ¡encontré la respuesta correcta! Espero que esta publicación ayude a alguien :-)

Integración rápida de Swift para proyectos basados ​​en Xcode Objc:

  1. Cree un nuevo *.swiftarchivo (en Xcode) o agréguelo usando Finder.
  2. Crea un Objective-C bridging headercuando Xcode te pregunte sobre eso.
  3. Implemente su clase Swift:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. Abra la Configuración de compilación y verifique estos parámetros:

    • Define Módulo: YES

      Copiar y pegar el nombre del parámetro en una barra de búsqueda

    • Nombre del módulo del producto: myproject

      Asegúrese de que el nombre del módulo del producto no contenga caracteres especiales

    • Instale el encabezado de compatibilidad de Objective-C: YES

      Una vez que haya agregado el *.swiftarchivo al proyecto, esta propiedad aparecerá en la Configuración de compilación

    • Encabezado de interfaz generado por Objective-C: myproject-Swift.h

      Este encabezado es generado automáticamente por Xcode

    • Encabezado de puente Objective-C: $(SRCROOT)/myproject-Bridging-Header.h
  5. Importe el encabezado de la interfaz Swift en su archivo * .m.

    #import "myproject-Swift.h"

    No preste atención a errores y advertencias.

  6. Limpia y reconstruye tu proyecto Xcode.
  7. ¡Lucro!
sig
fuente
2
¿Alguien ha visto mención de la configuración requerida (al menos para mí) en la documentación en: developer.apple.com/library/prerelease/ios/documentation/Swift/… en el paso 4 anterior? Si es así, me lo perdí. Gracias @ sig.
Morkrom
2
Mi problema era mucho más simple: no pude encontrar el archivo, "myproject-Swift.h"así que me parece que no funciona. Aparentemente, este archivo no está visible en el navegador del proyecto.
Asaf
66
@Asaf En realidad, sí, este archivo se genera automáticamente mediante Xcode y se ubica en la ruta de compilación del proyecto. Por lo tanto, puede encontrar este archivo manualmente en Finder / Console o abrirlo directamente en Xcode usando Cmd + LeftClick en #import "myproject-Swift.h".
sig
1
¡En cuanto a mí, # 5 fue suficiente para solucionar el problema!
skywinder
12
Con sus 4 horas, ahorró cientos de nuestras horas, muchas gracias :) Guardado en mi favorito;)
Abo3atef
65

No cree el archivo de encabezado usted mismo. Elimina el que creaste.

Asegúrese de que sus clases Swift estén etiquetadas @objco hereden de una clase que se deriva (directa o indirectamente) de NSObject.

Xcode no generará el archivo si tiene algún error de compilación en su proyecto; asegúrese de que su proyecto se compila limpiamente.

Cuenta
fuente
8
ser capaz de construir fue la clave para mí. No se pudo compilar porque no pudo encontrar mi archivo -swift.h, pero no pudo encontrar mi archivo -swift.h porque no se pudo compilar: /
anders
13
@anders mientras está atrapado en ese ciclo, puede usar find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -upara ver si el archivo se creó con un nombre inesperado como lo fue para mí. :)
CodeReaper
38

Permita que Xcode haga su trabajo, no agregue / cree encabezado Swift manualmente. Simplemente agregue @objc antes de su clase Swift ex.

@objc class YourSwiftClassName: UIViewController

En la configuración de su proyecto, busque los siguientes indicadores y cámbielos a SÍ (Proyecto y Destino)

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

Luego, limpie el proyecto y compile una vez, después de que la compilación tenga éxito (probablemente debería) importar debajo del archivo de encabezado en su archivo .m de clase objetiva-c

#import "YourProjectName-Swift.h" 

Boooom!

Bharat Modi
fuente
1
Gracias, esto fue increíblemente simple y resolvió mi problema.
Felipe
No veo ninguna de estas opciones en Configuración de compilación (Xcode 7.3.1). ¿Qué tengo que hacer?
iosdude
1
^ Tuve que cambiar de Basica Allen la barra superior.
iosdude
1
Embedded Content Contains Swiftse cambió a Always Embed Swift Standard LibrariesXcode 8: stackoverflow.com/questions/38792650/…
William Grand
@WilliamGrand Gracias por la sugerencia, actualicé la respuesta.
Bharat Modi
28

Probablemente también sea útil para aquellos de ustedes con un objetivo de Framework :

La declaración de importación del archivo de encabezado generado automáticamente se ve un poco diferente de los destinos de la aplicación. Además de las otras cosas mencionadas en otras respuestas, use

#import <ProductName/ProductModuleName-Swift.h>

en vez de

#import "ProductModuleName-Swift.h"

según la documentación de Apple en Mix & Match para objetivos de framework.

Jeehut
fuente
1
@dinesharjani Me alegro de poder ayudar! :)
Jeehut
¿Qué pasa con los objetivos de paquete?
Iulian Onofrei
14

Asegúrese de que su proyecto defina un módulo y de haberle dado un nombre. Luego reconstruya, y Xcode creará el -Swift.harchivo de encabezado y podrá importar.

Puede establecer la definición y el nombre del módulo en la configuración de su proyecto.

Leo Natan
fuente
14

Detalles: Proyecto Objective-C con código Swift 3 en Xcode 8.1

Tareas:

  1. Usa una enumeración rápida en la clase de Objective-C
  2. Use el objetivo-c enum en clase rápida

MUESTRA COMPLETA

1. Clase Objective-C que usa la enumeración Swift

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 en código Objective-C

En mi muestra, uso SwiftCode.h para detectar el código Swift en Objective-C. Este archivo se genera automáticamente (no creé una copia física de este archivo de encabezado en un proyecto), y solo puede establecer el nombre de este archivo:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Si el compilador no puede encontrar el código Swift de su archivo de encabezado, intente compilar el proyecto.

2. Clase Swift que usa la enumeración 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 código Objective-C en código Swift

Necesita crear un archivo de encabezado de puente. Cuando agrega el archivo Swift en el proyecto Objective-C, o el archivo Objective-C en el proyecto Swift Xcode le sugerirá que cree un encabezado de puente.

ingrese la descripción de la imagen aquí

Puede cambiar el nombre del archivo de encabezado de puente aquí:

ingrese la descripción de la imagen aquí

Bridging-Header.h

#import "ObjcClass.h"

Uso

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

Resultado

ingrese la descripción de la imagen aquí


Más muestras

Pasos de integración completos Objective-c y Swift descritos anteriormente . Ahora escribiré algunos otros ejemplos de código.

3. Llame a la clase Swift desde el código Objective-c

Clase 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 llamada)

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

Resultado

ingrese la descripción de la imagen aquí

4. Llame a la clase Objective-c desde el código Swift

Clase 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 llamada)

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

Resultado

ingrese la descripción de la imagen aquí

5. Use la extensión Swift en el código Objective-c

Extensión rápida

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

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

[UIView swiftExtensionFunc];

6. Use la extensión Objective-c en código rápido

Extensión 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 llamada)

UIView.objcExtensionFunc()
Vasily Bodnarchuk
fuente
Estas muestras son realmente útiles, ¡gracias! Y en cuanto a Swift 4+, necesitamos agregar @objcMembersal frente de la clase. Porque la @objcinferencia se ha reducido en Swift 4 para fines de optimización. Por ejemplo, una propiedad dentro de una clase derivada de NSObject, ya no inferirá @objc por defecto (como lo hizo en Swift 3). Obtuve esta información de esta respuesta .
Hustlion
11

Tuve el mismo problema y resultó que los símbolos especiales en el nombre del módulo se reemplazan por xcode (en mi caso, los guiones terminaron siendo subrayados). En la configuración del proyecto, marque "nombre del módulo" para encontrar el nombre del módulo para su proyecto. Después de eso, use ModuleName-Swift.ho cambie el nombre del módulo en la configuración.

Max Mikheyenko
fuente
10
Soy un idiota Estaba agregando el nombre de la clase y luego agregando "-Swift". Resulta que es el nombre del "módulo". +1 por hacerme darme cuenta de esto.
HotFudgeSunday
2
¡Otro imbécil aquí que pensó que era el nombre de la clase!
Charlie Martin
9

El archivo se crea automáticamente (hablando de Xcode 6.3.2 aquí). Pero no lo verá, ya que está en su carpeta de Datos Derivados. Después de marcar su clase rápida con @objc, compilar, luego buscar Swift.hen su carpeta de Datos Derivados. Debería encontrar el encabezado Swift allí.

Tuve el problema, que Xcode renombró mi my-Project-Swift.ha my_Project-Swift.hXcode no le gustan los "." "-"símbolos, etc. Con el método anterior, puede encontrar el nombre del archivo e importarlo a una clase Objective-C.

brainray
fuente
1
Esto también resolvió mi problema. En mi archivo .m, importo el archivo de esta manera #import "my_project-Swift.h" y el nombre real de mi proyecto esmy-project
Bhavin_m
Atención, no solo "." "-" también espacios :(
user1105951
8

Simplemente incluya #import "myProject-Swift.h" en el archivo .m o .h

PD No encontrará "myProject-Swift.h" en el inspector de archivos que está oculto. Pero es generado por la aplicación automáticamente.

Svitlana
fuente
Gracias por el aviso, amigo.
Felipe
Esta respuesta me ayudó y me salvó el día. Lo importante es que Xcode lo genera automáticamente y es un archivo HIDDEN. Yo mismo estaba creando "myProject-Swift.h" y no funcionaba.
C0mrade
5

La respuesta de @sig es una de las mejores, sin embargo, no funcionó para mí con el proyecto anterior (¡no es nuevo!), necesitaba algunas modificaciones. Después de muchas variaciones, encontré la receta para mí (usando XCode 7.2):

  1. Nombre del módulo del producto: $ (PRODUCT_NAME: c99extidentifier)
  2. Define Módulo: NO
  3. El contenido incrustado contiene Swift: NO
  4. Instale el encabezado de compatibilidad de Objective-C: SÍ
  5. Objective-C Bridging Header: ProjectName-Bridging-Header.h

El último punto (5) fue crucial. Lo puse solo en la segunda sección (campo Objetivos), el campo Proyecto debería dejarse vacío: de lo ingrese la descripción de la imagen aquícontrario, no generó el archivo "Project-Swift.h" correcto para mí (no incluía métodos rápidos).

Darius Miliauskas
fuente
1
también un enlace útil: ericasadun.com/2014/08/21/…
Darius Miliauskas
1
Gracias Gracias Gracias Muchas gracias @DariusMiliauskas solo lo hizo funcionar con tu enlace
a4arpan
1
@DariusMiliauskastgracias mucho! los 5 puntos también me resolvieron el problema en el antiguo proyecto Xcode
tatiana_c
Define Modulesdebería ser No??
Sunil Chauhan
@SunilChauhan, Sí, solo se usa para framewoks .
Iulian Onofrei
5

Hay dos condiciones,

  • Use su archivo rápido en el archivo objetivo c.
  • Use su archivo objetivo c en un archivo rápido.

Entonces, para ese propósito, debe seguir estos pasos:

  • Agregue su archivo swift en un proyecto de Objective-C o viceversa.
  • Crear archivo de encabezado (.h).
  • Vaya a Configuración de compilación y realice los siguientes pasos con la búsqueda,

    1. busque este texto "brid" y establezca una ruta de acceso de su archivo de encabezado.
    2. "Define Módulo": SÍ.
    3. "Incrustar siempre bibliotecas estándar de Swift": SÍ.
    4. "Instalar el encabezado de compatibilidad de Objective-C": SÍ.

Después de eso, limpia y reconstruye tu proyecto.

Use su archivo rápido en el archivo objetivo c.

En ese caso, primero escriba "@objc" antes de su clase en un archivo rápido.

Después de eso, en su archivo objetivo c, escriba esto,

  #import "YourProjectName-Swift.h"

Use su archivo objetivo c en un archivo rápido.

En ese caso, en su archivo de encabezado, escriba esto,

  #import "YourObjective-c_FileName.h"

Espero que esto ayude.

vikas prajapati
fuente
4

Para Swift 5:

  1. Agregue la @objcpalabra clave a su clase y métodos
  2. Agregue publicpalabras clave a su clase y métodos
  3. Deja que tu clase herede de NSObject
  4. Proyecto de construcción
  5. Poner #import "MyProject-Swift.h"en su archivo Objective-C

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }
Nico S.
fuente
"Agregue la palabra clave @objc a su clase y métodos" - lo mismo para Swift 4
Krzysztof Skrzynecki
3

En mi caso, aparte de estos pasos:

  1. Nombre del módulo del producto: myproject
  2. Define Módulo: SI
  3. El contenido incrustado contiene Swift: SÍ
  4. Instale el encabezado de compatibilidad de Objective-C: SÍ
  5. Encabezado de puente de Objective-C: $ (SRCROOT) /Sources/SwiftBridging.h

He necesitado poner la clase como pública para crear el archivo productName-Swift.h :

import UIKit

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

Acabo de descubrir que agregar un directorio de archivos rápidos a un proyecto no funcionará. Primero debe crear un grupo para el directorio, luego agregar los archivos rápidos ...

Darren Ehlers
fuente
@ <clase específica>; debe definirse, y luego el proyecto que usa verá esos archivos.
Nikita
2

Tuve el mismo problema y finalmente parecía que no estaban vinculados a los mismos objetivos. La clase ObjC está asociada a Target1 y Target2, la clase Swift solo está asociada a Target1 y no es visible dentro de la clase ObjC.

Espero que esto ayude a alguien.

Dani.Rangelov
fuente
Pasé completamente por alto esto con diferentes objetivos para la puesta en escena y la producción. ¡Gracias por su respuesta!
Benjamin Martin
¿Qué significa "adjunto"?
Iulian Onofrei
"Attached" = "members", deben aparecer como miembros objetivo
Dani.Rangelov
1

mi problema fue que me quedé atascado después de que xcode creó el archivo puente pero aún recibí un error en el nombre del archivo de encabezado MYPROJECTNAME-swift.h

1.Reviso el terminal y busco todos los archivos de puente rápido creados automáticamente:

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

ves lo que xcode creó.

  1. en mi caso, tenía espacio en el nombre de mi proyecto y xcode reemplaza esto es '_'
usuario1105951
fuente
1

Cuando agregue nuevos archivos Swift al proyecto, asegúrese de agregarlos a los objetivos correctos. Por favor, asegúrese de que cada archivo rápido que vaya a utilizar herede la clase NSObject y anote con @ObjCMembers Change a YES dentro de la configuración de compilación en la opción ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Cambie a SÍ dentro de la configuración de compilación en la opción DEFINES_MODULE.

Boris
fuente
0

Tengo el mismo error: myProjectModule-Swift.harchivo no encontrado ", pero, en mi caso, la razón real estaba en el destino de implementación incorrecto:" Swiftno está disponible en OS X anterior a 10.9; configúrelo MACOSX_DEPLOYMENT_TARGETen 10.9 o posterior (actualmente es '10 .7 ') "así que, cuando cambié el objetivo de implementación a 10.9, el proyecto se compiló con éxito.

Slavik
fuente
0

Mi problema era que la generación automática del archivo -swift.h no podía entender una subclase de CustomDebugStringConvertible. Cambié la clase para ser una subclase de NSObject en su lugar. Después de eso, el archivo -swift.h ahora incluía la clase correctamente.

Justin Domnitz
fuente
0

Tuve problemas porque agregaría clases a mi encabezado de puente de Objective-C, y en los encabezados de Object-C que se importaron, intentaban importar el encabezado rápido. Eso no le gustó.

Entonces, en todas mis clases de objetivos-c que usan swift, pero también están puenteadas, la clave era asegurarse de que usa las declaraciones de clase de reenvío en los encabezados, luego importa el archivo "* -Swift.h" en el archivo .m.

herradura7
fuente
0

No tuve que cambiar ninguna configuración en la compilación ni agregar @obj a la clase.

Todo lo que tenía que hacer era crear un encabezado de puente que se creaba automáticamente cuando creaba clases Swift en el proyecto Objective-c. Y luego solo tuve que hacer

import "Bedtime-Swift.h" <- dentro del archivo object-c que necesitaba usar ese archivo swift.

coolcool1994
fuente
0

bueno, después de leer todos los comentarios e intentarlo y leerlo e intentarlo nuevamente, logré incluir clases rápidas en mi proyecto Big obj-c. Entonces, gracias por toda la ayuda. Quería compartir un consejo que me ayudó a comprender mejor el proceso. En la clase .m, fui a la línea de importación del nombre de destino rápido #import "myTargetName-Swift.h" e hizo clic en la tecla:

comando + clic del mouse -> Saltar a definición ingrese la descripción de la imagen aquí

Allí puede ver toda la traducción de swift a obj-c y allí encontrará las diversas funciones re-declaradas en obj-c. Espero que este consejo te ayude tanto como a mí.

Techno Mag
fuente
0

Usando clases rápidas en Objective-C

Si va a importar código dentro de un Objetivo de aplicación (Mezclar Objective-C y Swift en un proyecto), debe usar la siguiente línea de importación #import "<#YourProjectName#>-Swift.h"para exponer el código Swift al código Objective-C [Mezclando el código Swift y Objective-C en un proyecto]

En esta publicación, describiré cómo importar la biblioteca estática Swift al código Objective-C

Consumidor de Objective-C -> biblioteca estática Swift

Xcode versión 10.2.1

Crear biblioteca estática Swift

Seguir Create Swift static library con las siguientes adiciones:

Exponer Swift API. Para usar las funciones de Swift de Objective-C [Acerca de]

Después de construir, debe encontrar un <product_name>-Swift.harchivo que debe ubicarse enDerivedSources [Archivo no encontrado]

Consumidor Objective-C con la biblioteca estática Swift

Drag and dropel binario en el proyecto Xcode [Acerca de]

Link Library[Símbolos indefinidos] [Enlace vs Incrustar]

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

Agregar Library Search paths[Biblioteca no encontrada para] [Ruta recursiva]

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

Añadir Header Search Paths[Módulo no encontrado] [Ruta recursiva]

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

Agregar vacío .swift fileal proyecto Objective-C. [Símbolos indefinidos] Cuando Xcode pregunte, presione Crear Bridging Header(creará module_name-Bridging-Header.h) y configure una ruta a este archivo en

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

Importar módulo al código del cliente Objective-C [Archivo no encontrado] [nombre_módulo]

#import "module_name-Swift.h"

Más ejemplos aquí.

yoAlex5
fuente
0

XCode 11.3.1:

Cuando quiero usar una clase interna Swift en un código objc, no se compila para su error "símbolo indefinido" (para otra clase interna y clase externa), verifiqué el encabezado "-swift.h" generado y ambas clases son ahí.

Después de intentar durante horas, convierto la clase interna en una clase normal y se compila.

Limpio el proyecto, elimino la carpeta DerivedData y se compila.

Bill Chan
fuente
1
¿Intentaste agregar @objcantes de la declaración de la clase interna?
Dnnagy
gracias @dnnagy, comprobé que no es un problema de sintaxis.
Bill Chan
-1

Después de hacer todo lo anterior, todavía recibí errores. Mi problema terminó siendo que los archivos Swift que necesitaba no se agregaron a los recursos del paquete por alguna razón.

Lo arreglé yendo a [MyTarget]> Build Phases> Copy Bundle Resources, luego hice clic en el botón más y agregué los archivos Swift.

onemoreanimal
fuente
Copiar recursos de paquete no debe incluir código fuente
Bill Chan