web-dev-qa-db-fra.com

Fichier d'en-tête Objective C à Swift avec plusieurs cibles

J'appelle avec succès mes classes Swift depuis Objective C (pour la cible "MyApp") via l'instruction d'importation:

#import "MyApp-Swift.h"

J'ai maintenant créé une nouvelle cible appelée "MyAppLite"

Lorsque je compile la nouvelle cible, des erreurs se produisent car "MyApp-Swift.h" est requis par le code, mais le compilateur crée "MyAppLite-Swift.h".

J'ai donc besoin de créer un #import en-tête Swift/ObjC conditionnel pour la cible que je compile. 

Comment cela peut-il être fait, ou existe-t-il un meilleur moyen?

56
Fittoburst

Il est également possible de définir le paramètre Product Module Name dans Build Settings pour qu'il soit identique pour tous vos modules (je l'ai défini sur $(PROJECT_NAME)), afin que le fichier <project>-Swift.h généré ait le même nom pour tous les modules. Cela élimine la nécessité d'ajouter/de vérifier les macros du préprocesseur. 

69
C0D3LIC1OU5

Le meilleur moyen que j'ai trouvé de résoudre ce problème réside dans les paramètres de votre projet partagé Xcode. Vous pouvez rechercher le paramètre suivant:

Nom d'en-tête d'interface générée Objective-C *

Si vous définissez cette valeur sur un nom d’en-tête commun, tel que "MyProject-Swift.h", il sera appliqué à chacune de vos cibles et vous pourrez utiliser la déclaration d’importation en toute sécurité dans l’un de vos fichiers Objective-C. Cela vous permet de continuer à utiliser des noms de module de produit uniques pour chaque cible, si nécessaire.

J'ai testé cela dans Xcode Version 6.4 (6E35b).

* Remarque: Ceci apparaîtra dans les paramètres de votre compilateur Swift, qui ne sont visibles que si des fichiers source Swift sont ajoutés à votre projet. De plus, si aucune source Swift n'est associée à une cible, les options du compilateur Swift ne seront pas visibles pour les paramètres de construction de cette cible.

Bonne chance!

49
Mike Fay

Les réponses précédentes ont quelques problèmes si vous décidez de renommer vos cibles ou votre projet, ou utilisez Swift_MODULE_NAME comme prévu.

La solution la plus universelle consiste à remplacer Swift_OBJC_INTERFACE_HEADER_NAME («Nom d'en-tête d'interface généré par Objective-C») dans les paramètres de projet du projet, et non de cibles, à:

  • $(PROJECT_NAME)-Swift.h - un par projet;
  • $(Swift_MODULE_NAME)-Swift.h - un par module (valeur par défaut).

 enter image description here

20
Dmitry Isaev

J'ai mis l'instruction appropriée #import <projet> -Swift.h dans un fichier d'en-tête de préfixe (<projet> -Prefix.pch) défini/ajouté pour chaque construction (cible/schéma).

5
Will

Eh bien, le seul moyen que je puisse résoudre est de ...

#ifdef IS_LITE
#import "MyApp_Lite-Swift.h"
#else
#import "MyApp-Swift.h"
#endif

Notez que s'il existe des caractères "illégaux" dans mon nom de module de produit, ils doivent être remplacés par des traits de soulignement.

J'espère que cela pourra aider!

4
Fittoburst

La seule façon de travailler est la suivante: 

1- de la première cible (qui a un pont fonctionnel) Paramètre de construction select En-tête de pontage Objective C  
2- Copier En-tête de pontage Objective C  
3- ouvrir l'autre cible Cadre de construction
4- Collez-le 5- Remplacez le fichier d’en-tête par votre nouveau fichier d’en-tête (cible B.h)

(maintenant vous avez cette option pour deux cibles) 

0
Ahmad Albash