web-dev-qa-db-fra.com

Xcode 8 avec un Swift et projet Objective-c généré en-tête "ModuleName-Swift.h" introuvable)

J'ai un projet avec Swift et Objective-C mixtes dans Xcode 8 qui utilise le fichier d'en-tête "ModuleName-Swift.h" généré pour importer Swift dans Objective -c, mais le préprocesseur n'est pas en mesure de trouver le fichier d'en-tête généré et génère une erreur lors de l'importation.

"Problème lexical ou de préprocesseur: 'Fichier ModuleName-Swift.h introuvable'"

enter image description here

Le projet se compile très bien, mais le préprocesseur génère des erreurs pour l'en-tête non trouvé et pour toutes les classes Swift appelées à l'intérieur de la classe, il n'y a pas de coloration syntaxique ou de complétion de code. C'est une tâche difficile de travailler avec = Swift classes dans Objective-c qui ne sont pas reconnues par Xcode 8, mais qui se compilent très bien.

Des idées sur la façon d'apaiser le préprocesseur dans Xcode 8?

26
myuiviews

J'avais exactement le même problème. Trouvé la solution après avoir ajouté un nouveau fichier visant une seule cible (par erreur) et remarqué qu'il n'a eu aucun problème à lire les classes Swift. Donc, si vous avez plusieurs cibles, et depuis la migration vous n'avez pas eu besoin de les construire et de les exécuter, vous suggérons de le faire.

25
Ernesto Fernandez

Vous rencontrez ce problème lorsque nous avons plusieurs cibles. Si la variable Nom d'en-tête d'interface généré par Objective-c dans Swift des cibles nouvellement créées est différent de celui de la cible d'origine) Modifiez-la à la même valeur que la cible d'origine. Voir ce qui suit:

changer, newtargetname-Swift.h en originaltargetname-Swift.h pour nouvelle cible

enter image description here

5
Mesut GÜNEŞ

Pour résoudre ce problème, Xcode 9.2, après de longues recherches, j'ai découvert que mon "nom d'en-tête d'interface généré par Objective-c" est nommé d'après le nom du produit " productname-Swift.h " enter image description here

2
datha

Vous devez l'ajouter dans vos paramètres de construction.

Il peut y avoir un problème lors de la migration vers Xcode 8, où vous aurez unspecified dans le paramètre de construction Swift.

Cela si de killerz

Accédez à Build Settings-> Objective-C Generated Interface Header Name et définissez la valeur sur YourModule-Swift.h (il est généralement déjà défini, il s'agit du nom de fichier que vous devez importer dans le fichier .m #import "YourModule-Swift.h "

1
Tal Zion

Si

  • les cibles normales de votre produit fonctionnent bien, mais
  • vous obtenez l'erreur lors de l'exécution de vos cibles de test ...

notez que chaque cible utilise (et devrait utiliser) un nom de fichier différent pour le nom d'en-tête d'interface généré par Objective-C .

Cela signifie que vous ne pouvez pas importer le fichier d'en-tête généré dans votre Objective-C .h fichiers, car ils ne seront pas trouvés dans la cible de test:

screenshot of import error when using .h file

Au lieu de cela, vous devez déplacer ces #import instructions dans votre Objective-C .m (fichiers d'implémentation), où ils seront créés avec succès.


Si vous devez vous référer à Swift classes dans un .h fichier, tilisez le @class directive , par exemple:

//
//  ViewController.h
//  import-example
//

#import <UIKit/UIKit.h>

@class SomeSwiftClass;

@interface ViewController : UIViewController

- (NSString *) titleFromGenerator:(SomeSwiftClass *)generator;

@end
1
Aaron Brager