Escribí 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
Escribí 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
Respuestas:
Necesitas importar TargetName-Swift.h
. Tenga en cuenta que es el nombre del objetivo: las otras respuestas cometen el error de usar el nombre de la clase.
Este archivo único es un encabezado autogenerado que define las interfaces Objective-C para todas las clases de Swift en su proyecto que se anotan @objc
o heredan de NSObject
.
Consideraciones:
Si su nombre de destino contiene espacios, reemplácelos con guiones bajos (por ejemplo, se My Project
convierte en My_Project-Swift.h
)
Si su objetivo es un marco, debe importar <TargetName/TargetName-Swift.h>
Asegúrese de que su archivo Swift sea miembro del objetivo
Instrucciones del sitio web de Apple:
Para importar código Swift en Objective-C desde el mismo marco
En Configuración de compilación , en Empaquetado , asegúrese de que la configuración de Definir módulo para ese objetivo de marco esté establecida en Sí . Importe el código Swift de ese objetivo de marco en cualquier archivo Objective-C .m dentro de ese objetivo de marco utilizando esta sintaxis y sustituyendo los nombres apropiados:
#import "ProductName-Swift.h"
Revisión:
Solo puede importar "ProductName-Swift.h" en archivos .m.
Los archivos Swift en su destino serán visibles en los archivos Objective-C .m que contienen esta declaración de importación.
Para evitar referencias cíclicas, no importe Swift en un archivo de encabezado Objective-C. En cambio, puede declarar hacia adelante una clase Swift para usarla en un encabezado Objective-C. Tenga en cuenta que no puede subclasificar una clase Swift en Objective-C.
NSObject
!!! no puedes simplemente declarar un class Blah
en rápido y hacer que funcione. necesita serclass Blah : NSObject
Esto es lo que debes hacer:
Crear un nuevo proyecto en Objective-C
Crea un nuevo .swift
archivo
Haga clic en su archivo de proyecto Xcode
Haga clic en Configuración de compilación
Busque la barra de búsqueda y busque el módulo Define .
Cambie el valor a Sí .
Buscar nombre del módulo del producto .
Cambie el valor al nombre de su proyecto.
En la aplicación delegada, agregue lo siguiente: #import "YourProjectName-Swift.h"
Nota: Siempre que quiera usar su archivo Swift, debe importar la siguiente línea:
#import "YourProjectName-Swift.h"
Defines module
en Build settings
que Yes
es lo que fija cosas para mí!
YourProjectName
en #import "YourProjectName-Swift.h"
será el nombre del proyecto a partir del paso 8. Es útil si el nombre del proyecto contiene caracteres especiales y no está seguro de qué es exactamente lo que debe formatearlo.
Vaya a la 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 "Nombre del módulo del producto" (de la que depende la propiedad anterior de forma predeterminada) varía en función de si compila para prueba / depuración / lanzamiento / etc. (como lo hace en mi caso), haga que esta propiedad sea independiente de eso variación estableciendo un nombre personalizado.
Importar el Swift
archivo dentro Objective-c
puede causar este error, si no lo hace 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 del proyecto Objective-C . Hubiera creado un encabezado puente automáticamente.
Comprobar Objective-C Generated Interface Header Name
en Targets -> Build Settings
.
Según lo anterior, importaré KJExpandable-Swift.h
tal como está.
El suyo será TargetName-Swift.h
, donde TargetName
difiere según el nombre de su proyecto u otro objetivo que podría haber agregado y ejecutado en él.
Como debajo de mi objetivo es KJExpandable
, entonces esKJExpandable-Swift.h
Primer paso:-
Seleccione Objetivo del proyecto -> Configuración de compilación -> Buscar ('Definir') -> Definir valor de actualización del módulo No a Sí
"Define Módulo": SÍ .
"Incrustar siempre bibliotecas estándar de Swift": SÍ .
"Instalar el encabezado de compatibilidad de Objective-C": SÍ .
Segundo paso:-
Agregue la clase de archivo Swift en el archivo Objective C ".h" como se muestra a continuación
#import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end
Importe 'ProjectName (Su nombre de proyecto) -Swift.h' en el archivo Objective C ".m"
//TestViewController.m
#import "TestViewController.h"
/*import ProjectName-Swift.h file to access Swift file here*/
#import "ProjectName-Swift.h"
Hay una advertencia si está importando código Swift en sus archivos Objective-C dentro del mismo marco. Debe hacerlo especificando el nombre del marco 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 verifica el directorio de productos compilados (antes de que #import
se agregue, por lo que ha tenido al menos una compilación exitosa con algún código Swift en el destino), aún debería ver el archivo MyFramework-Swift.h
en el Headers
directorio.
Si tiene un proyecto creado en Swift 4 y luego agregó archivos Objective-C, hágalo así:
@objcMembers
public class MyModel: NSObject {
var someFlag = false
func doSomething() {
print("doing something")
}
}
Referencia: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/
Consulte las notas preliminares sobre Swift y Objective C en el mismo proyecto
Deberías estar importando
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
Entonces, no es el nombre de la clase como escribió, sino el nombre de su módulo de producto y eso se encarga de importar todos los archivos rápidos, no solo uno específico
Busque "Nombre del encabezado de la interfaz generada por Objective-C" en la Configuración de compilación del destino que está tratando de compilar (digamos que es MyApp-Swift.h
) e importe el valor de esta configuración ( #import "MyApp-Swift.h"
) en el archivo de origen al que está intentando acceder sus API 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 del encabezado de la interfaz generada por Objective-C".
Además, si tiene guiones en el nombre de su módulo (digamos que es My-App
), entonces $(SWIFT_MODULE_NAME)
todos los guiones serán reemplazados por guiones bajos. Entonces tendrás que agregar #import "My_App-Swift.h"
.
Si desea utilizar el archivo Swift en la clase Objective-C , entonces, desde Xcode 8 en adelante, puede seguir los siguientes pasos:
Si ha creado el proyecto en Objective-C:
Compílelo y si generará un error de enlazador como: compilado con una versión más nueva del lenguaje Swift (3.0) que los archivos anteriores (2.0) para arquitectura x86_64 o armv 7
Haz un cambio más en tu
Construye y corre.
Tenga cuidado con los guiones y guiones bajos, pueden mezclarse y su Nombre de proyecto y Nombre de destino no serán los mismos que SWIFT_MODULE_NAME.
#import <TargetName-Swift.h>
verá cuando ingresa desde el teclado #import <y luego, automáticamente, Xcode le aconsejará.
Encuentra el archivo .PCH dentro del proyecto. y luego agregue #import "YourProjectName-Swift.h"
Esto importará los encabezados de clase. Para que no tenga que importar a 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