ModuleName-Swift.h file no encontrado en xcode8

Estoy intentando trabajar en un proyecto mixto Swift y ObjectiveC sin suerte.

Mi proyecto está hecho de 6 objectives:

  • Aplicación
  • Núcleo
  • CoreTest
  • Resumen
  • Extensión WatchKit
  • Aplicación WatchKit

He podido agregar una class Swift que tiene una membresía de destino (App) y usa el código ObjectiveC pasando del App-Bridging-Header.h El paradigma "ObjectiveC en el código Swift" funciona como un encanto.

En cambio, estoy luchando con el paradigma de "Swift into ObjectiveC code". En el caso específico, necesito usar una nueva class Swift dentro de un file ObjectiveC .m que sea miembro de cuatro objectives.

Lo que he estado haciendo hasta ahora es esto:

  1. Agregue un nuevo file Swift al proyecto Core especificando las cuatro membresías (App, Core, Summary, WatchKit Ext)
  2. XCode solicita crear -Bridging-Header.h para tres proyectos Core, Summary y WatchKit Ext (App-Bridging-Header.h ya existe desde que se usó anteriormente), y doy mi consentimiento (no sé por qué crea esos files dentro la misma carpeta de grupo en la que agrego mi class Swift pero nunca me importa)
  3. Creo la class Swift agregando la key @objc antes de la class
  4. Voy a verificar si el nombre del encabezado de la interfaz generada por Objective-C está configurado para todos los modules, y sí, es
  5. Voy a verificar si Defines Module está configurado en No en todos los modules y configurado en Yes en el proyecto principal, y sí, es
  6. Escribo las importaciones para los files -Swift.h para todos los cuatro objectives
  7. Dentro de mi class Objective-C trato de usar mi nueva class Swift, aparentemente parece funcionar (incluso autocomplete)
  8. Intento build el proyecto, pero falla al decir que no se encuentra el file -Swift.h

He seguido la guía Mix and Match de Apple y muchas hebras de SO, incluida esta que aparentemente trata el mismo problema mío pero no funciona.

También he visto esto y esto, pero no funcionó.

He intentado también Eliminar datos derivados, así como limpiar todo el proyecto varias veces sin suerte.

EDIT 1: más detalles

Esta es la statement de mi Swift class import RealmSwift

@objc class MyClass: Object {} 

Este es el fragment de uso de la class Swift dentro de ObjectiveC

 MyClass *app = [[MyClass alloc] init]; 

Si evito usar #import …- Swift.h, la compilation falla diciendo que estoy usando un ID no declarado "MyClass" y esto es sonido.

Si utilizo los files #import …- Swift.h, dice que el module X no puede encontrar el module Y y así sucesivamente.

EDIT 2: nombre del module Swift

Al observar la propiedad SWIFT_OBJC_INTERFACE_HEADER_NAME de cada objective, he visto que está construido con esta syntax $ (SWIFT_MODULE_NAME) -Swift.h ¿Necesito cambiar SWIFT_MODULE_NAME a MODULE_NAME ?

EDIT 3: Importaciones

Este es el set de importaciones para encabezados Swift en el file .m ObjectiveC. Estoy usando los nombres de module especificados en las properties relativas de Configuración de compilation. Tenga en count que uno tiene carácter '_' ya que el objective de la Extensión WatchKit tiene un espacio en el nombre del objective.

 #import "ProjectName_App-Swift.h" #import "ProjectName_Core-Swift.h" #import "ProjectName_Summary-Swift.h" #import "ProjectName_WatchKit_Extension-Swift.h" 

EDIT 4: visibilidad cruzada de los files -Swift.h

He intentado lo siguiente:

  • Se agregó una class Swift solo en la aplicación de destino.
  • XCode creó el encabezado de puenteo
  • Insertado #import "ProjectName_App-Swift.h" en el file ObjectiveC utilizado solo por la aplicación
  • Usé la class Swift dentro de este file
  • Comstack Y puedo utilizar la class Swift

Cuando la class Swift está definida para múltiples objectives y los objectives múltiples utilizan este file, este no funciona. Los errores de compilation son los siguientes: No se encontró el destino X -> "ProjectName_TargetY-Swift.h". Parece que un objective no puede ver otros objectives -Swift.h files.

¿Qué estoy haciendo mal? Gracias por tu ayuda

La suposition que hice en Editar 4 resultó ser la correcta. Si un proyecto tiene múltiples objectives, los files "-Swift.h" no se pueden importar en un file .m ObjectiveC.

Por lo tanto, hay una solución que debe adoptarse y es cambiar la configuration de compilation de SWIFT_OBJC_INTERFACE_HEADER_NAME y hacer que sea lo mismo en diferentes destinos. Para hacerlo, cambie las instrucciones que generan esta propiedad de $ (SWIFT_MODULE_NAME) -Swift.h a $ (PROJECT_NAME) -Swift.h como se explica aquí

También es posible configurar la configuration del Nombre del module del producto en Configuración de compilation para que sea la misma en todos sus modules (la configuré en $ (PROJECT_NAME)), de modo que el file -Swift.h que se genera tenga el mismo nombre en todos los modules . Esto elimina la necesidad de agregar / revisar macros de preprocesador.

Después de hacer esta Carpeta de compilation limpia, presione Alt y vaya al menu Producto. Dado que el nombre del encabezado se comparte entre objectives, ahora se puede importar una vez en el file .m ObjectiveC y todos los objectives pueden beneficiarse de las classs Swift.

Si después de la construcción todavía muestra el error, asegúrese de que se puede acceder al encabezado desde XCode haciendo clic en Cmd con su nombre. Debería abrir un file que contiene un código similar a este:

 SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass") @interface MyClass : NSObject - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; @end 

Si necesita asegurarse de que esos encabezados se estén generando, abra un terminal y utilice este command

 find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h" 

Debería ver un encabezado para cada objective.

Otro problema que me ocurrió después de esos cambios es que comenzó a dar errores en el código ObjectiveC que no toqué. El problema se debió a la position de la import, como se informa aquí :

Exactamente donde en la parte superior de un file .m usted #importa el encabezado de puente oculto puede marcar la diferencia. El signo habitual de problema es que obtiene un error de compilation de "nombre de tipo desconocido", donde el tipo desconocido es una class declarada en Objective-C. La solución es # importar el file .h que contiene la statement para el tipo desconocido en sus files Objective-C también, antes de # importar el encabezado de puente oculto. Tener que hacer esto puede ser una molestia, especialmente si el file Objective-C en cuestión no necesita saber sobre esta class, pero resuelve el problema y permite que prosiga la compilation.

Al final, el código se comstack y se ejecuta en el dispositivo y el simulador.

Tuve un problema similar y casi terminé pasando todo un día resolviendo el problema mientras seguía las sugerencias de otros desarrolladores en StackOverflow y algunas otras fonts.

Estaba actualizando de XCode 7.3.1 a XCode 8.2.1 y Swift 2.2 a Swift 3.0.1.
En mi caso, descubrí que el file PROJECT_NAME-Swift.h no se creó en:

~/Library/Developer/Xcode/DerivedData/PRODUCT-NAME-hdkrxixrxbiorwesffpqvefxsrzl/Build/Intermediates/PRODUCT-NAME.build/Debug/PRODUCT-NAME.build/Objects-normal/x86_64/PRODUCT-NAME-Swift.h.

Supongo que de alguna manera trata de referirse a este file de encabezado de la ruta anterior y, por lo tanto, el error. Lo copié manualmente. No hice una compilation limpia después de esto. Esto resolvió mi problema y el file de encabezado rápido comenzó a crearse para otras comstackciones y comstackciones.

Para mi caso, funciona bien en Xcode 8, pero los files con

 #import "Project-Swift.h" 

tiene importaciones faltantes como lo describe LucioB

Usar Xcode 9 elimina esos errores