¿Cómo puedo importar código Swift a Objective-C?


He escrito una biblioteca en Swift y no pude importarla a mi proyecto actual, escrito en Objective-C.

¿Hay alguna forma de importarlo?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Author: Tamás Sengel, 2014-06-08

13 answers

Necesitas importar TargetName-Swift.h. Tenga en cuenta que es el nombre de destino - las otras respuestas cometen el error de usar el nombre de la clase.

Este único archivo es un encabezado autogenerado que define interfaces Objective-C para todas las clases Swift en su proyecto que están anotadas con @objc o heredadas de NSObject.

Consideraciones:

  • Si su nombre de destino contiene espacios, reemplácelos con guiones bajos (por ejemplo, My Project se convierte en My_Project-Swift.h)

  • Si tu objetivo es un marco, es necesario importar <TargetName/TargetName-Swift.h>

  • Asegúrese de que su archivo Swift es miembro del destino

 330
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-03 10:22:40

Instrucciones del sitio web de Apple:

Para importar código Swift a Objective-C desde el mismo framework

En Configuración de compilación , en Empaquetado , asegúrese de que el Define el Módulo el ajuste para ese objetivo marco se establece en Yes. Importar el código Swift de ese objetivo marco a cualquier Objetivo-C.m archivo dentro de que framework target usando esta sintaxis y sustituyendo la adecuada nombres:

#importar "Nombre del producto-Swift.h "

Revisión:

Solo puede importar "ProductName-Swift.h " in .archivos m.

Los archivos Swift en su destino serán visibles en Objective-C.m archivos que contiene esta declaración de importación.

Para evitar referencias cíclicas, no importe Swift en un Objective-C archivo de cabecera. En su lugar, puede reenviar declarar una clase Swift para usarla en un encabezado Objective-C. Tenga en cuenta que no puede subclase una clase Swift en Objective-C.

introduzca la descripción de la imagen aquí

 121
Author: Andrei Papancea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-08 19:50:12

Esto es lo que debe hacer:

  1. Crear un nuevo Proyecto en Objective-C

  2. Crear un nuevo archivo .swift  

    • Aparecerá una ventana emergente y preguntará a "¿Le gustaría configurar un encabezado de puente de Objective-C".
    • Elija .
  3. Haga clic en su archivo de proyecto Xcode

  4. Haga clic en Configuración de compilación

  5. Encuentre la barra de búsqueda y busque Define el Módulo .

  6. Cambie el valor a .

  7. Buscar Nombre del módulo del producto.

  8. Cambia el valor por el nombre de tu proyecto.

  9. En App delegate, agregue lo siguiente : #import "YourProjectName-Swift.h"


Nota: Siempre que desee utilizar su archivo Swift, debe importar la siguiente línea:

#import "YourProjectName-Swift.h"

 111
Author: Sumit singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 10:21:07

Si estás usando Cocoapods e intentas usar un pod Swift en un proyecto ObjC, simplemente puedes hacer lo siguiente:

@import <FrameworkName>;

introduzca la descripción de la imagen aquí

 27
Author: KingPolygon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-29 20:18:22

Vaya a configuración de compilación en su archivo de proyecto y busque "Nombre de encabezado de Interfaz generado por Objective-C. El valor de esa propiedad es el nombre que debe incluir.

Si su propiedad "Product Module Name" (de la que depende por defecto la propiedad anterior) varía dependiendo de si compila para test/debug/release/etc (como lo hace en mi caso), entonces haga que esta propiedad sea independiente de esa variación estableciendo un nombre personalizado.

 14
Author: Lukas Kalinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-22 11:46:53

Importar Swift archivo dentro de Objective-c puede causar este error, si no import correctamente.

NOTA: No tiene que importar archivos Swift externamente, solo tiene que importar un archivo que se encargue de los archivos swift.

Cuando Creó/copió el archivo Swift dentro de proyecto Objective-C. Habría creado un encabezado de puente automáticamente.

Marque Objective-C Generated Interface Header Name en Targets -> Build Settings.

introduzca la descripción de la imagen aquí

Basado en lo anterior, I importará KJExpandable-Swift.h tal como está.

El tuyo será TargetName-Swift.h, donde TargetName difiere según el nombre de tu proyecto u otro objetivo que hayas añadido y que se esté ejecutando en él.

Como a continuación mi objetivo es KJExpandable, por lo que es KJExpandable-Swift.h
introduzca la descripción de la imagen aquí

 11
Author: KiranJasvanee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-04 10:59:42

Primer Paso:-

Seleccione Destino del proyecto - > Configuración de compilación - > Buscar ('Definir') - > Definir Módulo actualización de valor No a

", Define el Módulo": .

"Incrustar siempre bibliotecas estándar Swift" : .

"Install Objective-C Compatibility Header" : YES.

introduzca la descripción de la imagen aquí

Segundo Paso:-

Agregar clase de archivo Swift en Objective C ".h " Archivo como abajo

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Import 'ProjectName(Su Nombre de Proyecto)-Swift.h ' en el objetivo C ".m " file

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"
 9
Author: Darshan Panchal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-17 10:42:49

Hay una advertencia si está importando código Swift a sus archivos Objective-C dentro del mismo marco. Tienes que hacerlo especificando el nombre del framework y los corchetes angulares:

#import <MyFramework/MyFramework-Swift.h>

MyFramework aquí está la configuración de compilación" Nombre del módulo del producto " (PRODUCT_NAME = MyFramework).

Simplemente agregar #import "MyFramework-Swift.h" no funcionará. Si comprueba el directorio built products (antes de que se agregue un #import, por lo que ha tenido al menos una compilación exitosa con algún código Swift en el destino), entonces debería ver el archivo MyFramework-Swift.h en el directorio Headers.

 7
Author: Misha Karpenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 10:07:12

Checkout las notas previas a la publicación sobre Swift y Objective C en el mismo proyecto

Https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

Usted debe importar

#import "SCLAlertView-Swift.h"
 3
Author: Nitin Alabur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-08 01:15:45

Busque "Nombre de encabezado de interfaz generado por Objective-C" en la configuración de compilación del destino que está intentando compilar (digamos que es MyApp-Swift.h) e importe el valor de esta configuración (#import "MyApp-Swift.h") en el archivo de origen donde está intentando acceder a sus API de Swift.

El valor predeterminado para este campo es $(SWIFT_MODULE_NAME)-Swift.h. Puede verlo si hace doble clic en el campo de valor de la configuración "Nombre de encabezado de interfaz generado por Objective-C".

También, si tiene guiones en el nombre de su módulo (digamos que es My-App), entonces en el $(SWIFT_MODULE_NAME) todos los guiones serán reemplazados por guiones bajos. Entonces tendrás que añadir #import "My_App-Swift.h".

 2
Author: Misha Karpenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-08 08:12:34

Si desea utilizar el archivo Swift en la claseObjective-C , por lo que a partir de Xcode 8 puede seguir los siguientes pasos:

Si ha creado el proyecto en Objective-C:

  1. Crear nuevo archivo Swift
  2. Xcode solicitará automáticamente Archivo de encabezado de puente
  3. Generarlo
  4. Importar "ProjectName-Swift.h " en su controlador Objective-C (importar en la implementación no en la interfaz) (si su proyecto tiene espacio entre el nombre, use subrayado " nombre_proyecto-Swift.h")
  5. Podrá acceder a su clase Objective-C en Swift.

Compílelo y si generará un error de enlazador como: compilado con una versión más reciente del lenguaje Swift (3.0) que los archivos anteriores (2.0) para la arquitectura x86_64 o armv 7

Hacer un cambio más en su

  1. Xcode - > Project -> Target -> Build Settings -> Use Legacy Swift Language Version - > Yes

Compilar y Ejecutar.

 1
Author: Dheeraj D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-08 04:55:56

Encontrar el .Archivo PCH dentro del proyecto. y luego agregar #import "YourProjectName-Swift.h" Esto importará los encabezados de la clase. Para que no tenga que importar en un archivo 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
 0
Author: Ram G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-18 20:31:18

Si ha creado un proyecto en Swift 4 y luego ha agregado archivos de Objective C, haga lo siguiente

@objcMembers
public class MyModel: NSObject {
       var someFlag = false         // @objc
       func doSomething() {         // @objc
        print("doing something")
       }

}

Referencia https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4 /

 0
Author: Prashant Bhayani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-31 16:08:15