Intento integrar el Swift
código en mi aplicación. Mi aplicación está escrita Objective-C
y agregué una Swift
clase. He hecho todo lo descrito aquí . Pero mi problema es que Xcode
no ha creado el -Swift.h
archivo, 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 @objc
pero no ayudó. ¿Qué puedo hacer ahora?
EDITAR: Apple dice: "Cuando importas el código Swift en Objective-C, confías en un Xcode-generated
archivo 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
}
}
fuente
YourProjectName-Swift.h
debe 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.h
a los archivos en los que desea usar las clases Swift.myProjectModule
? El-Swift.h
archivo 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.h
y eso es lo que deberías incluir.-Swift.h
mi Mac, y aún así puedo incluirlo. Así que no te obsesiones buscando un archivo así. Solo asegúrese de nombrarlo correctamente.#import <MyProjectName/MyProjectName-Swift.h>
Respuestas:
Pasé unas 4 horas tratando de habilitar
Swift
en miXcode
proyecto basado en Objective-C. Mimyproject-Swift.h
archivo se creó con éxito, pero miXcode
no vio miSwift-classes
. Entonces, decidí crear un nuevoXcode
proyecto 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:
*.swift
archivo (en Xcode) o agréguelo usando Finder.Objective-C bridging header
cuando Xcode te pregunte sobre eso.Implemente su clase Swift:
Abra la Configuración de compilación y verifique estos parámetros:
YES
myproject
YES
myproject-Swift.h
$(SRCROOT)/myproject-Bridging-Header.h
Importe el encabezado de la interfaz Swift en su archivo * .m.
fuente
"myproject-Swift.h"
así que me parece que no funciona. Aparentemente, este archivo no está visible en el navegador del proyecto.#import "myproject-Swift.h"
.No cree el archivo de encabezado usted mismo. Elimina el que creaste.
Asegúrese de que sus clases Swift estén etiquetadas
@objc
o hereden de una clase que se deriva (directa o indirectamente) deNSObject
.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.
fuente
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u
para ver si el archivo se creó con un nombre inesperado como lo fue para mí. :)Permita que Xcode haga su trabajo, no agregue / cree encabezado Swift manualmente. Simplemente agregue @objc antes de su clase Swift ex.
En la configuración de su proyecto, busque los siguientes indicadores y cámbielos a SÍ (Proyecto y Destino)
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
Boooom!
fuente
Basic
aAll
en la barra superior.Embedded Content Contains Swift
se cambió aAlways Embed Swift Standard Libraries
Xcode 8: stackoverflow.com/questions/38792650/…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
en vez de
según la documentación de Apple en Mix & Match para objetivos de framework.
fuente
Asegúrese de que su proyecto defina un módulo y de haberle dado un nombre. Luego reconstruya, y Xcode creará el
-Swift.h
archivo de encabezado y podrá importar.Puede establecer la definición y el nombre del módulo en la configuración de su proyecto.
fuente
Detalles: Proyecto Objective-C con código Swift 3 en Xcode 8.1
Tareas:
MUESTRA COMPLETA
1. Clase Objective-C que usa la enumeración Swift
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:
2. Clase Swift que usa la enumeración Objective-C
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.
Puede cambiar el nombre del archivo de encabezado de puente aquí:
Uso
Resultado
Más muestras
3. Llame a la clase Swift desde el código Objective-c
Resultado
4. Llame a la clase Objective-c desde el código Swift
Resultado
5. Use la extensión Swift en el código Objective-c
6. Use la extensión Objective-c en código rápido
fuente
@objcMembers
al frente de la clase. Porque la@objc
inferencia 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 .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.h
o cambie el nombre del módulo en la configuración.fuente
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 buscarSwift.h
en su carpeta de Datos Derivados. Debería encontrar el encabezado Swift allí.Tuve el problema, que Xcode renombró mi
my-Project-Swift.h
amy_Project-Swift.h
Xcode 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.fuente
#import "my_project-Swift.h"
y el nombre real de mi proyecto esmy-project
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.
fuente
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):
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 contrario, no generó el archivo "Project-Swift.h" correcto para mí (no incluía métodos rápidos).
fuente
Define Modules
debería serNo
??Hay dos condiciones,
Entonces, para ese propósito, debe seguir estos pasos:
Vaya a Configuración de compilación y realice los siguientes pasos con la búsqueda,
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,
Use su archivo objetivo c en un archivo rápido.
En ese caso, en su archivo de encabezado, escriba esto,
Espero que esto ayude.
fuente
Para Swift 5:
@objc
palabra clave a su clase y métodospublic
palabras clave a su clase y métodosNSObject
Poner
#import "MyProject-Swift.h"
en su archivo Objective-Cfuente
En mi caso, aparte de estos pasos:
He necesitado poner la clase como pública para crear el archivo productName-Swift.h :
fuente
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 ...
fuente
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.
fuente
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ó.
fuente
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.
fuente
Tengo el mismo error:
myProjectModule-Swift.h
archivo no encontrado ", pero, en mi caso, la razón real estaba en el destino de implementación incorrecto:"Swift
no está disponible en OS X anterior a 10.9; configúreloMACOSX_DEPLOYMENT_TARGET
en 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.fuente
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.
fuente
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.
fuente
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.
fuente
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
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í.
fuente
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.h
archivo que debe ubicarse enDerivedSources
[Archivo no encontrado]Consumidor Objective-C con la biblioteca estática Swift
Drag and drop
el binario en el proyecto Xcode [Acerca de]Link Library
[Símbolos indefinidos] [Enlace vs Incrustar]Agregar
Library Search paths
[Biblioteca no encontrada para] [Ruta recursiva]Añadir
Header Search Paths
[Módulo no encontrado] [Ruta recursiva]Agregar vacío
.swift file
al proyecto Objective-C. [Símbolos indefinidos] Cuando Xcode pregunte, presione CrearBridging Header
(crearámodule_name-Bridging-Header.h
) y configure una ruta a este archivo enImportar módulo al código del cliente Objective-C [Archivo no encontrado] [nombre_módulo]
Más ejemplos aquí.
fuente
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.
fuente
@objc
antes de la declaración de la clase interna?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.
fuente