Recientemente he estado trabajando para agregar Swift a un proyecto existente, para poder probarlo de una manera real.
Al agregar un archivo fuente Swift al proyecto, no tengo problemas para obtener el "Encabezado de puente", es decir, Objective-C a Swift.
Pero el *-Swift.h
archivo de encabezado que se supone que expone las clases Swift, ya sea marcadas @objc
o subclases de clases ObjC, no se encuentra en ninguna parte :-(
No veo ninguna instrucción específica sobre cómo lograr el uso de mi nueva subclase, escrita en Swift, en el código de mi aplicación principal (que todavía es Objective-C).
La aplicación de la que soy desarrollador principal tiene una base de código bastante grande (70,000 líneas), por lo que la transición de una vez está fuera de discusión.
fuente
Respuestas:
Ahora funciona.
Finalmente funciona Gracias a todos por la ayuda :-)
fuente
Build Settings
debajoPackaging
, miDefines Module
se establece enYes
y creé unProduct Module Name
sin espacios. El "* -Swift.h" no es generado por XCode 6. ???Defines Module
configuréYes
tanto para proyecto como para destino, yProduct Module Name
definido, sin espacios , pero parece que no puedo generar este archivo.Tuve un problema similar y descubrí que solo puedes agregar
#import "ProductModuleName-Swift.h"
a archivos obj-c .m, no archivos .h para el encabezado paraguas que se encuentra
fuente
Descubrí que tenía que arreglar todo errores de compilación antes de que generara el archivo.
El problema para mí fue que era un problema de huevo / gallina, ya que no vi ningún error de compilación hasta que realmente comenté la
#import
declaración://#import "ProductModuleName-Swift.h"
que reveló un montón de otros errores en mi código Swift.
Una vez que solucioné estos nuevos errores y conseguí que la fuente se construyera con éxito, eliminé el comentario
#import
y el bingo. El encabezado se creó e importó correctamente :)fuente
Si eres como yo, probablemente hayas equivocado el nombre del encabezado. Después de golpearme la cabeza por un tiempo, busqué el archivo en DerivedData y, efectivamente, está allí. En mi configuración (usando la carpeta de datos derivados estándar, creo):
Lo encontrare. Si nada en esa carpeta coincide, entonces Xcode no lo está generando.
Estoy usando Xcode Versión 6.2 (6C86e)
fuente
-Swift.h
y no el nombre de mi archivo Swift real. ¡Gracias!Si el nombre del módulo de su proyecto tiene espacios, debe reemplazar los espacios con un guión bajo.
Por ejemplo, si el nombre de su proyecto es "Mi proyecto", usaría:
fuente
* Lo único importante es: *
utilizar el "Nombre del módulo del producto" definido en el destino, seguido de -Swift.h
No importa si el parámetro "Define Module" está establecido en Sí o No o si el proyecto "Nombre del módulo del producto" no está configurado.
Recordatorio: las clases Swift deben derivarse de NSObject o estar etiquetadas con el atributo @objc para exponerse a ObjectiveC / Foundation || Cacao ...
fuente
Quería agregar una razón más por la que podrías encontrar un problema con esto: estaba creando un marco que combinaba código Swift y Objective-C. No pude importar las clases Swift fuera del marco; busqué el archivo -Swift.h y se estaba generando pero estaba vacío.
El problema resultó ser muy, muy simple: ¡no había declarado pública ninguna de mis clases de Swift! Tan pronto como agregué la palabra clave pública a las clases, pude usarlas desde clases dentro y fuera del marco.
También cabe destacar que, dentro del marco (dentro de los archivos .m solo como se menciona en otra respuesta) tuve que importar el archivo -Swift.h como:
fuente
Yo tuve el mismo problema. Parece que tiene que ajustar la configuración (define el módulo y el nombre del módulo del producto) antes de agregar su primer archivo Swift.
Si lo hace después, el archivo "* -Swift.h" no se generará para este proyecto, incluso si agrega más archivos Swift o elimina el archivo Swift y crea uno nuevo.
fuente
Permítame compartir mis experiencias tratando de usar Swift en un antiguo proyecto objc. Yo no tengo que fijar
Defines module
aYES
.En mi caso, necesitaba asegurarme manualmente de que había un encabezado de puente objc. Solo el nombre del encabezado de interfaz generado estaba presente en mi configuración de compilación.
Esto condujo a la generación de un archivo MyApp-Swift.h, pero sin ningún rastro de mis clases Swift.
La documentación de Apple dice que se le pedirá que cree un encabezado de puente al agregar su primer archivo rápido. Bueno, no lo fui. Agregué manualmente un
MyApp-Bridging-header.h
archivo y lo señalé en el campo "Encabezado de puente de Objective-C". Eso hizo que mi archivo MyApp-Swift.h se llenara con mis clases Swift.Documentos: Importar Swift a Objective-C
fuente
Aquí hay otra variación de moduleName-Swift.h que no se está generando.
Decidí incluir IOS Charts en mi proyecto, pero no quería mezclar las fuentes en el mismo directorio, por lo que coloqué la carpeta Charts Project junto a la carpeta de proyecto de mi código. Arrastré el proyecto de Gráficos a la barra de navegación de mi proyecto e incluí el marco en la lista de binarios incrustados del objetivo de mi proyecto en la configuración general del proyecto y establecí el interruptor Contenido incrustado contiene contenido incrustado en sí en la pestaña Configuración de compilación de mi proyecto en la sección Opciones de compilación .
El archivo moduleName-Swift.h de mi proyecto nunca se generaría sin importar qué otros interruptores o configuraciones sugieran aquí. Finalmente, usando el método de Lou Z para buscar los archivos -Swift.h, vi que se estaba generando un archivo Charts-Swift.h en el directorio de compilación xcode de mi proyecto en Charts.framework / Headers /
La solución para usar el paquete Swift de ios-charts de Daniel Gindi sin incluir el código en el directorio fuente de mi proyecto fue agregar:
A los módulos que trazan los datos de mi proyecto.
fuente
El nombre del archivo siempre va precedido por su nombre de destino . Se conoce como nombre del producto, pero prácticamente es el nombre de destino. Entonces, si desea que se compile para un nuevo objetivo, esté listo para esperar el
that_target-Swift.h
archivo.Una forma de manejar esto es
MY_TARGET=1
. Agregue esto en Configuración del proyecto-> Configuración de compilación-> Macros de preprocesador para cada uno de sus objetivos.Agregue estas líneas en el archivo PCH
La ventaja de usar el archivo PCH es que no tiene que incluir los encabezados en todas partes.
Esto debería funcionar bien.
fuente
include
dentro). Luego importo este nuevo archivo desde donde lo necesito. Estoy a favor de no poner esto dentro de la PCH o cualquier archivo .h para evitar dependencias cíclicas y usar el conveniente encabezado en los archivos .m..pch
se desaconsejan los archivos . En segundo lugar, el nombre del archivo contiene el nombre del Producto y NO el nombre del objetivo. Podría ser una coincidencia que sea igual, ¡pero usó el nombre del producto!Si Xcode realmente está generando su encabezado -Swift.h (en el interior de DerivedData) pero no se refiere a sus clases Swift, asegúrese de que también tenga un encabezado de puente definido. La forma en que leí los documentos implicaba que solo necesitaba eso para llamar a Objective-C desde Swift, pero parece ser necesario también para llamar a Swift desde Objective-C.
Vea mi respuesta: https://stackoverflow.com/a/27972946/337392
EDITAR: se debe a los modificadores de acceso público frente a los internos, como finalmente encontré explicado en los documentos de Apple:
fuente
Secundando lo que mucha gente tiene aquí, pero agregando una captura de pantalla pertinente. El código Swift y Obj-C ciertamente pueden vivir juntos. No es un juego de todo o nada.
Para acceder a los archivos Swift en su Objective-C, todo lo que necesita hacer es agregar esta llamada a su archivo Obj-C (en el archivo .m / implementación):
(Donde {product_module_name} representa el nombre del módulo del producto de su proyecto). En lugar de tratar de adivinar el nombre del módulo de su producto o averiguar las esquinas con espacios y caracteres especiales, simplemente vaya a la pestaña de configuración de compilación en el proyecto y escriba "nombre del módulo del producto": el inspector le revelará el suyo. El mío era algo que no esperaba que fuera. Mira esta captura de pantalla si estás confundido.
Y para que el código Obj-c funcione en Swift, solo necesita agregar un archivo de encabezado de puente e importar los encabezados Obj-C relevantes allí.
fuente
#import
?¡Lo más importante es que este archivo es invisible! Al menos está en Xcode6 beta5. No habrá tal archivo llamado "YourModule-Swift.h" en su espacio de trabajo. Solo asegúrese de tener el nombre del módulo y definir el módulo establecido en sí, y usarlo en su clase Objective-C.
fuente
Ok, ¡aquí están todas las cosas que realmente necesitas!
1.Retire todos los archivos rápidos que ha agregado y compile el código, sin ningún error.
----------
----------
2. Vaya a la configuración de compilación "Proyectos" y configure el nombre del módulo del producto. El proyecto debe tener un nombre de módulo de producto que no incluya espacios.
----------
----------
3.El módulo Define debe establecerse en Sí en Configuración de compilación, en Empaquetado, en su proyecto, ¡y no en destino!
----------
----------
4.Ahora cree un archivo rápido o un controlador de vista, en archivo-> archivo nuevo->
----------
----------
Le pedirá que cree un encabezado de puente, permita que haga uno. Si lo ha rechazado una vez, deberá agregar manualmente un encabezado -Bridging.h
5.Agregue @objc en el controlador, para decirle al compilador que hay algún archivo rápido, que debe exponerse a ObjectiveC
----------
----------
6. Construya el proyecto e importe #import "-Swift.h" en cualquiera de los controladores de ObjectC, ¡y funcionará! ¡Puede hacer Comando-clic en él para ver el archivo real!
----------
----------
¡Espero que esto ayude!
fuente
Esta respuesta aborda el caso de uso en el que ya puede tener un código Objective-C que llama a clases Swift y luego comienza a recibir este error.
Cómo arreglar el problema
Los siguientes pasos finalmente resolvieron todos los problemas para mí. Leí arriba alguien que menciona el "pollo y el huevo" y es exactamente ese concepto el que me llevó a este procedimiento. Este proceso explícito muestra que uno tiene que eliminar cualquier código de Objective-C que haga referencia a las clases Swift hasta que se genere el encabezado.
Nota Bene: Las respuestas sobre el cambio de espacios a guiones bajos y el módulo Define a YES como se indicó anteriormente aún se aplican al realizar este proceso, al igual que las reglas especificadas en la Documentación de Apple .
Puente de ruta de encabezado
En un error, el archivo ProductModuleName-Bridging-Header.h no se encontró durante el proceso de compilación. Este hecho generó un error
Una inspección más cercana del error indicó que el archivo nunca existiría en la ubicación descrita porque en realidad estaba ubicado en ( una ruta incorrecta )
'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'. una búsqueda rápida de la configuración de compilación de destino / proyectos para realizar la corrección manualmente y el archivo abc-Swift.h nuevamente se generó automáticamente.
fuente
Debe importar un encabezado en las clases Objective-C, que es:
Se genera automáticamente, en la referencia que dice "Cualquier archivo Swift en su destino será visible en los archivos Objective-C .m que contienen esta declaración de importación".
fuente
No se crea un archivo real en el proyecto ([ProductModuleName] -Swift.h). Cmd + clic en la importación o la genera sobre la marcha (y en la memoria) para que pueda ver cómo se realiza el enlace, o abre un archivo en algún lugar en algún directorio de caché de Xcode, pero no está en el directorio del proyecto.
Debe establecer la definición del proyecto del módulo Defines (en la configuración de compilación del objetivo) en Sí y si el nombre de módulo tiene espacios ni guiones - _ utilización de todas las importaciones del archivo [ProductModuleName] -Swift.h.
Puede importarlo en todos los archivos .h y .m donde usa tipos rápidos o puede importarlo en .pch.
Entonces, si mi Módulo (proyecto) se llama "Proyecto de prueba", lo importaría así, en el archivo .pch de mi proyecto (justo allí):
fuente
Solo un aviso para cualquiera que haya usado "." en el nombre del proyecto. Xcode reemplazará el "." con un guión bajo "_" para la versión Swift del archivo de encabezado de puente. Curiosamente, el Bridging-Header.h que se genera no reemplaza los puntos con guiones bajos.
Por ejemplo, un proyecto con el nombre My.Project tendría los siguientes nombres de archivo de Encabezado de puente.
Bridging-Header.h (Autogenerado)
My.Project-Bridging-Header.h
Swift.h
My_Project.h
Espero que esto ayude a cualquiera que haya usado un período y se haya quedado atrapado como yo. Este archivo se puede encontrar en la siguiente ubicación.
Macintosh HD / Users / user /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources
Cuídate,
Jon
fuente
El proyecto debe tener un nombre de módulo que no incluya espacios. Define Module debe establecerse en Yes en Build Settings, en Packaging. comentó la declaración #import:
Si aún tiene un error al importar "ProductModuleName-Swift.h", entonces
// # import "ProductModuleName-Swift.h"
que reveló un montón de otros errores en mi código Swift.
Una vez que arreglé estos nuevos errores y conseguí que la fuente se construyera con éxito, eliminé el comentario #import y bingo. El encabezado se creó e importó correctamente :)
fuente
Encontré un truco que siempre funciona en mí.
Haga este trabajo (elimine y cree el "ProductModuleName-Swift.h" del archivo appDelegate.h y limpie su código) cada vez que reciba este error para silenciarlo.
fuente
Encontré esta solución
Ahora usted puede
en lugar de ProductModuleName-Swift.h
Esta es una solución alternativa, para la próxima versión de Xcode creo que este problema se resolverá. Buena suerte
fuente
#import “ProductModuleName-Swift.h”
aparece con un error en el archivo SwiftBridge.h en lugar del archivo de código original de Objective-C.Estaba teniendo dificultades para determinar el nombre de mi módulo / la importación del objetivo-c de los encabezados de swift. También leí muchos artículos aquí.
Pero la respuesta definitiva para el nombre de su proyecto con todos sus caracteres especiales incluidos (ya sea '.' O un número o un espacio): puede encontrar el texto que funcionará para usted en el " Nombre del módulo del producto " en la Configuración de compilación del objetivo .
Por ejemplo, mi nombre de destino comenzó con un número: "1mg" y el campo mencionado anteriormente mostraba "_mg" como el nombre de mi módulo.
así que usé #import "_mg-Swift.h" y funcionó.
fuente
En mi caso, tuve que establecer el objetivo de implementación en al menos "OS X 10.9" y el
-Swift.h
encabezado se generó automáticamente. Tenga en cuenta que puede obtener muchas advertencias de desaprobación cuando cambia la versión de destino de la implementación, especialmente cuando tiene una base de código Objective C más grande y antigua. En nuestro caso, también teníamos mucho trabajo por hacer en archivos XIB y ver clases.fuente
Si antes pudo crear un proyecto, sin problemas relacionados con el
“ProductModuleName-Swift.h” not found
error, y ahora vuelve a tener esos errores desagradables, la razón podría estar en sus cambios recientes.Para mí esto fue por (accidental)
.swift
codificación de archivo incorrecta . Revertir los cambios y recuperarlos manualmente hace el trabajo.fuente
Este puede ser un punto obvio (tal vez demasiado obvio), pero debe tener al menos un archivo rápido en el proyecto para que se genere el encabezado. Si está escribiendo código repetitivo o de configuración con la intención de escribir rápidamente más tarde, la importación no funcionará.
fuente
Tuve que eliminar el código rápido de WatchOS2 de mi proyecto Objective C. Y solo después de eso, XCode ofreció generar -Swift.h
fuente
Tuve un problema similar pero mi proyecto se estaba compilando antes y de repente recibí un error después de algunos cambios en el código de los archivos. Me tomó un tiempo descubrir por qué recibo el error 'Archivo no encontrado' para el archivo myproject-swift.h. Los cambios en el código que había hecho tenían algunos errores. Xcode no apuntó poner esos errores en su lugar todo el tiempo mostrando el 'Error de archivo no encontrado'. Luego obtuve una copia del código de la versión anterior y lo comparé con el nuevo código y el archivo combinado uno por uno. Después de cada fusión de archivos se cumplió el proyecto para encontrar el error. Entonces, si tiene un error en su código, Xcode puede mostrar 'error de archivo no encontrado' para el archivo myproject-swift.h. Lo más probable es que tenga un error de compilación en su proyecto. Limpie esos errores y funcionará.
fuente
Si está usando algo como Cocoapods (y está trabajando fuera del espacio de trabajo en lugar del proyecto) intente abrir el proyecto y construirlo antes de abrir el espacio de trabajo y construir. YMMV.
fuente
A veces solo necesita desarmar y luego configurar nuevamente la membresía de destino en el archivo obj-c .m.
fuente