Rápido al encabezado Objective-C no creado en Xcode 6


242

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.harchivo de encabezado que se supone que expone las clases Swift, ya sea marcadas @objco 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.


55
Si lo hace Realmente está preguntando en qué parte del IDE de XCode necesita hacer algo para crear este encabezado Swift-> ObjC, ya que no sucede "por defecto" al agregar el código Swift a un proyecto ObjC existente.
David Kristensen

55
@Popeye, no estoy de acuerdo. En este caso, si estuviera editando los archivos y compilando desde la línea de comandos, no vería este problema. Lo que está en cuestión es el IDE que está funcionando (o se supone que debe funcionar) en su nombre. Esto es más probable en relación con la configuración del proyecto, que es definitivamente una función IDE
gaige

11
@Popeye De los documentos (PDF) : cuando importa el código Swift en Objective-C, confía en un archivo de encabezado generado por Xcode para exponer esos archivos a Objective-C. (Mi negrita, las cursivas de Apple.) Esta es claramente una pregunta sobre una característica de Xcode que te ayuda a usar Swift y Objective-C juntos, y las tres etiquetas son seguramente apropiadas.
Caleb

3
Lo resolví con la ayuda de gaige y la documentación. Y no solo lanzo la etiqueta: en este caso, el archivo de encabezado DEBE ser creado y visible para XCode. No fue así, produciendo errores.
David Kristensen

3
@Popeye No hay nada incorrecto: copié la cita directamente de la página 46. Has encontrado un pasaje similar pero diferente que dice más o menos lo mismo.
Caleb

Respuestas:


165

Ahora funciona.

  1. El proyecto debe tener un nombre de módulo de producto que no incluya espacios.
  2. Define Module debe establecerse en Yes en Build Settings, en Packaging.

Finalmente funciona Gracias a todos por la ayuda :-)


64
En Build Settingsdebajo Packaging, mi Defines Modulese establece en Yesy creé un Product Module Namesin espacios. El "* -Swift.h" no es generado por XCode 6. ???
Loozie

25
Una nota adicional: Primero intenté establecer las propiedades mencionadas en el nivel de destino, y no funcionó, no se generó el archivo "* -Swift.h". Funcionó cuando lo configuré a nivel de proyecto.
Marcin

22
También estoy teniendo el mismo problema. Lo Defines Moduleconfiguré Yestanto para proyecto como para destino, y Product Module Namedefinido, sin espacios , pero parece que no puedo generar este archivo.
Craig Otis

8
En caso de que otros estén tan confundidos como yo ... Tuve que tener suerte ciega aquí y simplemente importar el encabezado, ya que no se completaría automáticamente.
shawnwall

14
No puede importar -swift en archivos de encabezado (.h) solo en la implementación.
zirinisp

122

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


2
Esto es correcto y ... ¿qué pasa si necesito usar una clase Swift en un encabezado objc? Intenté con la declaración hacia adelante, tampoco funciona.
Ixx

2
Whops, lo siento, la declaración adelantada funciona. Olvidé agregar un punto y coma: P
Ixx

14
Para futuros buscadores: en sus encabezados, envíe la declaración haciendo @class YourSwiftClass en la parte superior de sus archivos .h (en lugar de importar el encabezado general)
rogueleaderr

44
¿Qué sucede si necesito usar una enumeración Swift en un archivo de encabezado?
jakecraige

1
Además, si "#import ProductModuleName-Swift.h" está en algún archivo de encabezado, entonces el archivo ProductModuleName-Swift.h no se generará en absoluto (a partir de Xcode 7.2), por lo que si se ha eliminado (por ejemplo, limpiando la compilación carpeta), verá mensajes de error en todas partes donde se importa el archivo, incluso para archivos .m, lo que aumenta la confusión.
René

59

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 #importdeclaració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 #importy el bingo. El encabezado se creó e importó correctamente :)


Gracias, esto es exactamente lo que me estaba deteniendo. Después de corregir los errores de compilación rápida, estaba listo. (Xcode versión 6.1.1)
Rick Roberts

10
Este es un gran punto y una buena razón para activar la configuración "continuar construyendo después de errores" en Xcode.
Kendall Helmstetter Gelner

Ese es exactamente mi caso también: falta -Swift-h sucedió después de los mismos cambios en el código fuente rápido
Giorgio Calzolato

3
después de ver un problema de pollo / huevo Soy consciente de mi problema, buena analogía
d0ye

Este problema siempre volvía a mí (Xcode10) y simplemente interpreté Xcode como defectuoso. Sin embargo
SumakuTension

44

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):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

Lo encontrare. Si nada en esa carpeta coincide, entonces Xcode no lo está generando.

Estoy usando Xcode Versión 6.2 (6C86e)


Esto lo hizo por mí. He estado pensando que el autocompletado lo recogerá y supuse que no estaba allí. Ver en el directorio despejó las cosas.
Será

A veces ver es creer. No pude hacer que las cosas funcionen hasta que seguí la respuesta recomendada y luego usé estos pasos para encontrar el encabezado generado que, para mi sorpresa, fue pospuesto con -Swift.hy no el nombre de mi archivo Swift real. ¡Gracias!
Josh Habdas

¡Gracias! Me ahorró mucho tiempo
estemendoza 14/12/2015

43

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:

#import "My_Project-Swift.h"


12
Si el nombre del módulo de su proyecto tiene guiones, también deben reemplazarse con un guión bajo. Entonces, si el nombre de su proyecto es "My-Project" use #import "My_Project.h"
Jeff Ames

66
Además, si el nombre del módulo de su proyecto comienza con un número, también debe reemplazarse con un guión bajo. "1st Project" será "_st_Project-Swift.h"
Danation

31

* Lo único importante es: *

utilizar el "Nombre del módulo del producto" definido en el destino, seguido de -Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

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 ...


1
Eso es cierto: no es necesario "Definir módulo" en el Proyecto o en Target
Giorgio Calzolato

25

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:

#import <FrameworkName/FrameworkName-Swift.h>

2
En Framework también noto que para usar las clases Swift, deben heredarse de NSObject (incluso @objc no ayudará) y todos los métodos / propiedades deben ser públicos.
dmitrynikolaev

3
Al menos en la versión preliminar actual de XCode 7, hasta que herede de NSObject, no estarán disponibles en el encabezado rápido generado.
dmitrynikolaev

El 100% NO solucionó mi problema. CADA solución es "hacer públicas tus clases". Hice esto. Período. Todavía NO revela las clases Swift en proyectos que usan el marco.
datWooWoo

@lespommes, deberías escribir una pregunta y presentar un proyecto de muestra en algún lugar que muestre el problema, alguien podría descubrir qué está pasando ... Di mi respuesta como una posible solución, porque es el error de visibilidad que más cometo frecuentemente.
Kendall Helmstetter Gelner

2
¡Oh, sí, tu pista sobre la importación finalmente me sirvió! ¡Muchas gracias!
endowzoner

14

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.


No estoy seguro de que sea cierto. No decidí habilitar 'Define Module' hasta mucho después de crear muchos archivos rápidos y pude obtener un -Swift.h muy bien.
Michael Peterson

De hecho, me entristece informar que este es exactamente el problema que tuve :( Tuve que eliminar mi .swift y volver a agregarlo, y luego todo funcionó.
StuFF mc

2
¿Ahora que? Estoy en medio de cambiar el código Swift y ObjC. Mi proyecto-Swift.h no se actualiza. Incluso intenté eliminar el archivo de encabezado.
Suhail Bhat

2
Tuve que escribir esto, dev.iachieved.it/iachievedit/?p=980 . El consejo para actualizar la configuración de compilación antes de agregar archivos Swift fue clave para mí.
Joe

¿Significa esto que tendría que recrear el proyecto y volver a agregar todo si no hiciera esto? No importa lo que haga, parece que no puedo generar el archivo * -Swift.h.
kgreenek

13

Permítame compartir mis experiencias tratando de usar Swift en un antiguo proyecto objc. Yo no tengo que fijar Defines modulea YES.

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.

Falta el encabezado de puente

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.harchivo 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


sí, por cualquier razón, mi archivo ObjC Swift.h se generó con encabezados de clase Swift solo después de haber agregado un archivo de encabezado de puente vacío al proyecto.
Andrew

Igual que aquí. Mi código Swift no se importó en el archivo generado * -Swift.h hasta que agregué un archivo de encabezado de puente Objective-C vacío.
Nik

12

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:

#import "Charts/Charts-Swift.h"

A los módulos que trazan los datos de mi proyecto.


¿Es posible cambiar / personalizar la información sobre herramientas en los gráficos IOS? en caso afirmativo, ¿puedes dar un ejemplo?
Amit Chauhan

12

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.harchivo.

Una forma de manejar esto es

  1. Agregue un preprocesador para cada uno de sus objetivos que sea el nombre de su propio objetivo (sin espacios). Ex. MY_TARGET=1. Agregue esto en Configuración del proyecto-> Configuración de compilación-> Macros de preprocesador para cada uno de sus objetivos.
  2. Si está utilizando un archivo PCH,

Agregue estas líneas en el archivo PCH

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

La ventaja de usar el archivo PCH es que no tiene que incluir los encabezados en todas partes.

  1. Si no está utilizando un archivo PCH, simplemente agregue estas mismas líneas en un solo encabezado e incluya ese encabezado siempre que necesite usar las clases rápidas.

Esto debería funcionar bien.


Realmente me gusta usar esta solución en lugar de importar el encabezado directamente a su fuente. Tengo una estructura de proyecto complicada donde el mismo código fuente está siendo utilizado por múltiples objetivos / proyectos. Esto evita agregar una declaración desordenada #if #else en todo mi código. ¡Gracias por la respuesta!
Ryan

Esto me salvó el día. Puse las 5 líneas de código en un archivo "Something-Swift-Headers.h" (con includedentro). 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.
ctietze

Esto está mal en muchos niveles. En primer lugar, .pchse 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!
Iulian Onofrei

10

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:

Por defecto, el encabezado generado contiene interfaces para declaraciones Swift marcadas con el modificador público. También contiene los marcados con el modificador interno si el objetivo de su aplicación tiene un encabezado de puente Objective-C.


Sí, esto realmente ayudó. No lo sabia. Pensé que solo era necesario para el caso de uso de Obj-C de Swift.
nodepond

Feliz de ayudar. He editado la respuesta porque desde entonces descubrí la razón de este comportamiento.
Echelon

7

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):

#import "{product_module_name}-Swift.h"

(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.

ingrese la descripción de la imagen aquí

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í.


1
¿No debería ser #import?
Iulian Onofrei

Digamos que el nombre de mi proyecto es ABC, entonces "ABC-Swift.h", debe existir en mi proyecto, ¿verdad? No puedo encontrarlo ¿Necesitas crearlo manualmente? No estoy creando ningún archivo rápido, solo incluyo una vaina de cacao que está escrita en rápido.
nr5

El Encabezado de puente (en su caso, ABC-Swift.h) no se crea automáticamente. Cuando intentas crear tu primer archivo Swift en un proyecto Obj-C, Xcode normalmente te pide que agregues uno. También puede crear un encabezado Bridging por su cuenta como se muestra aquí (control + f para 'encabezado bridging'): developer.apple.com/library/content/documentation/Swift/…
Brian Sachetta

5

¡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.


5

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.

----------

ingrese la descripción de la imagen aquí

----------

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.

----------

ingrese la descripción de la imagen aquí

----------

3.El módulo Define debe establecerse en Sí en Configuración de compilación, en Empaquetado, en su proyecto, ¡y no en destino!

----------

ingrese la descripción de la imagen aquí

----------

4.Ahora cree un archivo rápido o un controlador de vista, en archivo-> archivo nuevo->

----------

ingrese la descripción de la imagen aquí

----------

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

----------

ingrese la descripción de la imagen aquí

----------

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!

----------

ingrese la descripción de la imagen aquí

----------

¡Espero que esto ayude!


>> ¡Puede hacer Comando-clic en él para ver el archivo real! Esto es genial
Jagan

4

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.

  1. Comente la declaración #import "ProductModuleName-Swift.h" en su archivo de implementación de Objective-C
  2. Comente cualquier referencia en el archivo de implementación de Objective-C a las clases Swift
  3. Limpiar y construir
  4. Resolver todos los errores / advertencias
  5. Elimine el comentario en la declaración #import "ProductModuleName-Swift.h"
  6. Limpiar y compilar (correctamente o corregir los errores restantes, verifique que no esté haciendo referencia a ninguna clase de Swift en Objective-C en este momento . Si es así, coméntelos temporalmente)
  7. Verifique que "ProductModuleName-Swift.h" se genera haciendo clic con Cmd en el nombre de clase de la instrucción #import "ProductModuleName-Swift.h"
  8. Elimine el comentario sobre el código que hace referencia a las clases Swift en el archivo de implementación de Objective-C.
  9. Limpiar y compilar de forma normal (se debe generar "ProductModuleName-Swift.h" y el código de Objective-C que hace referencia a las clases Swift se puede utilizar de forma normal)

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

<desconocido>: 0: error: puente de cabecera '/Users/Shared/Working/abc/abc-Bridging-Header.h' no existe

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.

configuración de compilación


1
¿Qué pasa si su proyecto es tan grande que comentar todas las referencias de código rápido en el objetivo c no es práctico?
Andrew Morris el

3

Debe importar un encabezado en las clases Objective-C, que es:

#import “ProductModuleName-Swift.h”

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".


24
Pero, cuando hago eso, aparece un error de compilación, AppName-Swift.h no existe. Mientras que, AppName-Bridging-Header.h existe.
David Kristensen

55
@DavidKristensen: ¿Obtuviste la solución ?, ya que me he quedado con el mismo problema
BaSha

2

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 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í):

#import "Test_Project-Swift.h"

2

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


2

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 :)


Mi problema era que también tenía errores en mi código Swift, pero no lo supe hasta que descomente el archivo -Swift.h. ¡Gracias!
Will

1

Encontré un truco que siempre funciona en mí.

  1. Cree su #import "ProductModuleName-Swift.h" en su archivo appDelegate.h y en su archivo ProductName-Prefix.pch. Si no lo tiene en xcode 6, puede crearlo de esta manera. ¿Por qué ProjectName-Prefix.pch no se crea automáticamente en Xcode 6?
  2. Comando + shift + k para limpiar su código, si recibe un error sobre su "ProductModuleName-Swift.h" elimínelo del archivo appDelegate.h.
  3. Limpia tu código nuevamente. Ahora todo funcionará como un encanto
  4. Si vuelve a recibir un error sobre "ProductModuleName-Swift.h", ahora cree nuevamente en el archivo appDelegate.h y limpie su código nuevamente.

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.


1

Encontré esta solución

  • Crear SwiftBridge.h
  • ponga #import "ProductModuleName-Swift.h"
  • Hacer público este archivo .h (importante) Seleccione el archivo -> En Mostrar el inspector de archivos (barra derecha) -> Hacer público

Ahora usted puede

#import "SwiftBridge.h"

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


No funciona Solo lo intenté. La línea #import “ProductModuleName-Swift.h”aparece con un error en el archivo SwiftBridge.h en lugar del archivo de código original de Objective-C.
Supertecnoboff

1

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ó.

El nombre del módulo del producto en la configuración de compilación de target proporciona el nombre del módulo correcto que funcionará para su proyecto


Si puede editar en un enlace a una captura de pantalla, podría editar su respuesta para mostrársela.
SuperBiasedMan

1

En mi caso, tuve que establecer el objetivo de implementación en al menos "OS X 10.9" y el -Swift.hencabezado 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.


2
Para otros, busque en la Configuración de compilación su objetivo, obtenga el nombre exacto "MyProject-Swift.h", eso es lo que necesita incluir como "#include" MyProject-Swift.h "en los archivos Objc apropiados. BTW, esto la respuesta realmente me ayudó: trabajar para convertir algunas fuentes antiguas de ObjectiveC.
David H

0

Si antes pudo crear un proyecto, sin problemas relacionados con el “ProductModuleName-Swift.h” not founderror, y ahora vuelve a tener esos errores desagradables, la razón podría estar en sus cambios recientes.

Para mí esto fue por (accidental) .swiftcodificación de archivo incorrecta . Revertir los cambios y recuperarlos manualmente hace el trabajo.


0

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á.


0

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


0

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á.


0

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.


0

A veces solo necesita desarmar y luego configurar nuevamente la membresía de destino en el archivo obj-c .m.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.