En-tête Swift vers Objective-C non créé dans Xcode 6

242

J'ai récemment travaillé pour ajouter Swift à un projet existant, pour pouvoir l'essayer de façon réelle.

Lors de l'ajout d'un fichier source Swift au projet, je n'ai aucun problème à obtenir le "Bridging Header", c'est-à-dire, Objective-C à Swift.

Mais le *-Swift.hfichier d' en- tête qui est censé exposer les classes Swift soit marquées @objcou sous - classes de classes ObjC, est nulle part à trouver :-(

Je ne vois aucune instruction spécifique sur la façon d'accomplir l'utilisation de ma nouvelle sous-classe, écrite en Swift, dans mon code d'application principal (qui est toujours Objective-C).

L'application dont je suis le développeur principal a une base de code assez grande (70 000 lignes), il est donc hors de question de la faire passer en une seule fois.

David Kristensen
la source
5
Oui. C'est vraiment demander où dans l'IDE XCode vous devez faire quelque chose pour créer ce Swift-> ObjC créé, car cela ne se produit pas "par défaut" lors de l'ajout de code Swift à un projet ObjC existant.
David Kristensen
5
@ Popeye, je ne suis pas d'accord. Dans ce cas, si vous modifiez les fichiers et compilez à partir de la ligne de commande, vous ne verrez pas ce problème. C'est l'IDE qui exécute (ou est censé exécuter) en votre nom qui est en cause. Ceci est probablement lié à la configuration du projet, qui est certainement une fonction IDE
gaige
11
@Popeye À partir des documents (PDF) : lorsque vous importez du code Swift dans Objective-C, vous vous appuyez sur un fichier d'en -tête généré par Xcode pour exposer ces fichiers à Objective-C. (Mes caractères gras, l'italique d'Apple.) Il s'agit clairement d'une question sur une fonctionnalité de Xcode qui vous aide à utiliser Swift et Objective-C ensemble, et les trois balises sont sûrement appropriées.
Caleb
3
Je l'ai résolu avec l'aide de gaige et de la documentation. Et je ne jette pas simplement la balise: dans ce cas, le fichier d'en-tête DEVRAIT être créé par et visible par XCode. Ce n'était pas le cas, ce qui donnait des erreurs.
David Kristensen
3
@Popeye Il n'y a rien d'anormal - j'ai copié la citation directement à partir de la page 46. Vous avez trouvé un passage similaire mais différent qui dit plus ou moins la même chose.
Caleb

Réponses:

165

Maintenant ça marche.

  1. Le projet doit avoir un nom de module de produit qui n'inclut pas d'espaces.
  2. Définit le module doit être défini sur Oui dans les paramètres de construction, sous Empaquetage.

Fonctionne enfin. Merci à tous pour l'aide :-)

David Kristensen
la source
64
En Build Settingsdessous Packaging, mon Defines Moduleest réglé sur Yeset j'ai créé un Product Module Namesans espaces. Le "* -Swift.h" n'est pas généré par XCode 6. ???
Loozie
25
Une remarque supplémentaire: j'ai d'abord essayé de définir les propriétés mentionnées au niveau cible, et cela n'a pas fonctionné, le fichier "* -Swift.h" n'a pas été généré. Cela a fonctionné lorsque je l'ai défini au niveau du projet.
Marcin
22
J'ai aussi le même problème. J'ai Defines Moduledéfini à la Yesfois pour le projet et la cible, et un Product Module Namedéfini, sans espaces , mais je n'arrive pas à générer ce fichier.
Craig Otis
8
Juste au cas où d'autres seraient aussi confus que moi ... J'ai dû avoir une chance aveugle ici et simplement importer l'en-tête, car il ne se remplirait pas automatiquement.
shawnwall
14
Vous ne pouvez pas importer -swift sur les fichiers d'en-tête (.h) uniquement dans l'implémentation.
zirinisp
122

J'ai eu un problème similaire et j'ai constaté que vous ne pouvez ajouter

#import "ProductModuleName-Swift.h"

aux fichiers obj-c .m, pas aux fichiers .h pour l'en-tête parapluie à trouver

macduff
la source
2
C'est correct, et ... et si j'ai besoin d'utiliser une classe Swift dans un en-tête objc? J'ai essayé avec la déclaration avancée, cela ne fonctionne pas non plus.
Ixx
2
Whops, désolé, la déclaration directe fonctionne. J'ai oublié d'ajouter un point-virgule: P
Ixx
14
Pour les futurs chercheurs: dans vos en-têtes, faites une déclaration en faisant @class YourSwiftClass en haut de vos fichiers .h (au lieu d'importer l'en-tête parapluie)
rogueleaderr
4
Que faire si j'ai besoin d'utiliser une énumération Swift dans un fichier d'en-tête?
jakecraige
1
De plus, si "#import ProductModuleName-Swift.h" est dans un fichier d'en-tête, le fichier ProductModuleName-Swift.h ne sera pas généré du tout (à partir de Xcode 7.2), donc s'il avait été supprimé (par exemple en nettoyant la construction dossier), vous verrez des messages d'erreur partout où le fichier est importé, même pour les fichiers .m, ajoutant à la confusion.
rene
59

J'ai constaté que je devais corriger toutes les erreurs de génération avant de générer le fichier.

Le problème pour moi était que c'était un problème de poulet / œuf, en ce sens que je n'ai vu aucune erreur de construction jusqu'à ce que j'aie commenté la #importdéclaration:

//#import "ProductModuleName-Swift.h"

qui a révélé un tas d'autres erreurs dans mon code Swift.

Une fois que j'ai corrigé ces nouvelles erreurs et obtenu le bâtiment source avec succès, j'ai commenté le #importet le bingo! L'en-tête a été créé et importé correctement :)

petehare
la source
Merci, c'est exactement ce qui me retenait. Après avoir corrigé les erreurs de construction rapide, j'étais prêt à partir. (Xcode version 6.1.1)
Rick Roberts
10
C'est un excellent point et une bonne raison d'activer le paramètre "Continuer la construction après les erreurs" dans Xcode.
Kendall Helmstetter Gelner
C'est exactement mon cas aussi: manquant -Swift-h s'est produit après les mêmes changements dans le code source rapide
Giorgio Calzolato
3
après avoir vu un problème de poulet / œuf, je réalise mon problème, bonne analogie
d0ye
Ce problème me revenait toujours (Xcode10) et je viens d'interpréter Xcode comme un buggy. C'était la réponse cependant
SumakuTension
44

Si vous êtes comme moi, vous avez probablement mal le nom de l'en-tête. Après avoir dénigré ma tête pendant un moment, j'ai cherché le fichier dans DerivedData et bien sûr, il est là. Sur ma configuration (en utilisant le dossier de données dérivées standard, je crois):

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

Le trouvera. Si rien dans ce dossier ne correspond, alors Xcode ne le génère pas.

J'utilise Xcode version 6.2 (6C86e)

Lou Zell
la source
Cela l'a fait pour moi. Je pensais que la saisie semi-automatique le reprendrait, je pensais juste que ce n'était pas là. Voir dans le répertoire a éclairci les choses.
Will
Parfois, voir, c'est croire. Je n'ai pas pu faire fonctionner les choses avant de suivre la réponse recommandée, puis j'ai utilisé ces étapes pour trouver l'en-tête généré qui, à ma grande surprise, a été postfixé -Swift.het non le nom de mon fichier Swift réel. Je vous remercie!
Josh Habdas
Merci!
M'a
43

Si le nom de votre module de projet contient des espaces, vous devez remplacer les espaces par un trait de soulignement.

Par exemple, si le nom de votre projet est "Mon projet", vous utiliseriez:

#import "My_Project-Swift.h"

JohnMorrison
la source
12
Si le nom du module de votre projet contient des tirets, ils doivent également être remplacés par un trait de soulignement. Donc, si le nom de votre projet est "My-Project", utilisez #import "My_Project.h"
Jeff Ames
6
De plus, si le nom de votre module de projet commence par un nombre, il doit également être remplacé par un trait de soulignement. "1st Project" sera "_st_Project-Swift.h"
Danation
31

* La seule chose importante est: *

pour utiliser le "Product Module Name" défini dans la cible, suivi 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.

Peu importe si le paramètre "Defines Module" est défini sur Yes ou No ou si le projet "Product Module Name" n'est pas défini.

Rappel: les classes Swift doivent dériver de NSObject ou avoir été marquées avec l'attribut @objc pour être exposées à ObjectiveC / Foundation || Cacao ...

Luc-Olivier
la source
1
C'est vrai: pas besoin de "Définir le module" dans le projet ou dans la cible
Giorgio Calzolato
25

Je voulais ajouter une autre raison pour laquelle vous pourriez trouver un problème avec cela - je créais un framework qui mélangeait le code Swift et Objective-C. Je n'ai pas pu importer les classes Swift en dehors du framework - j'ai vérifié le fichier -Swift.h et il était en cours de génération mais était vide.

Le problème s'est avéré très, très simple - je n'avais déclaré aucun de mes cours Swift public! Dès que j'ai ajouté le mot-clé public aux classes, j'ai pu les utiliser à partir de classes à l'intérieur et à l'extérieur du framework.

À noter également, à l'intérieur du cadre (uniquement dans les fichiers .m comme le mentionne une autre réponse), j'ai dû importer le fichier -Swift.h en tant que:

#import <FrameworkName/FrameworkName-Swift.h>
Kendall Helmstetter Gelner
la source
2
Dans Framework, je note également que pour utiliser les classes Swift, elles doivent être héritées de NSObject (même @objc n'aidera pas) et toutes les méthodes / propriétés doivent être publiques.
dmitrynikolaev
3
Au moins dans la pré-version actuelle de XCode 7, jusqu'à ce que vous héritiez de NSObject, ils ne seront pas disponibles dans l'en-tête swift généré.
dmitrynikolaev
100% n'a PAS résolu mon problème. CHAQUE solution est de "rendre vos classes publiques". J'ai fait ça. Période. Il ne révèle toujours PAS les classes Swift dans les projets qui utilisent le framework.
datWooWoo
@lespommes, vous devriez rédiger une question et mettre un exemple de projet quelque part qui présente le problème, quelqu'un pourrait comprendre ce qui se passe ... Je viens de donner ma réponse comme une solution possible, car c'est l'erreur de visibilité que je fais le plus fréquemment.
Kendall Helmstetter Gelner du
2
Oh oui, votre indice avec l'importation a finalement fait l'affaire pour moi! Merci beaucoup!
endowzoner
14

J'ai eu le même problème. Il semble que vous deviez ajuster les paramètres (Définit le module et le nom du module du produit) avant d'ajouter votre premier fichier Swift.

Si vous le faites par la suite, le fichier "* -Swift.h" ne sera pas généré pour ce projet même si vous ajoutez d'autres fichiers Swift ou supprimez le fichier Swift et créez-en un nouveau.

user3540830
la source
Je ne suis pas sûr que ce soit vrai. Je n'ai décidé d'activer 'Defines Module' que bien après avoir créé de nombreux fichiers rapides et j'ai pu obtenir un -Swift.h très bien.
Michael Peterson
Je suis en fait triste de signaler que c'est exactement le problème que j'ai eu :( J'ai dû supprimer mon .swift et le rajouter, puis tout a fonctionné.
StuFF mc
2
Maintenant quoi? Je suis en train de changer le code Swift et ObjC. Mon Project-Swift.h ne se met pas à jour. J'ai même essayé de supprimer le fichier d'en-tête.
Suhail Bhat
2
J'ai dû écrire celui-ci, dev.iachieved.it/iachievedit/?p=980 . L'astuce sur la mise à jour des paramètres de construction avant d'ajouter des fichiers Swift était la clé pour moi.
Joe
Est-ce à dire que je devrai recréer le projet et tout rajouter si je ne le fais pas? Peu importe ce que je fais, je n'arrive pas à générer le fichier * -Swift.h.
kgreenek
13

Permettez-moi de partager mes expériences en essayant d'utiliser Swift dans un ancien projet objc. Je n'avais pas à me mettre Defines moduleà YES.

Dans mon cas, je devais m'assurer manuellement qu'il y avait un en-tête de pontage objc. Seul le nom d'en-tête d'interface généré était présent dans mes paramètres de génération.

En-tête de pontage manquant

Cela a conduit à la génération d'un fichier MyApp-Swift.h, mais sans aucune trace de mes classes Swift.

La documentation Apple indique que vous serez invité à créer un en-tête de pontage lors de l'ajout de votre premier fichier swift. Eh bien, je ne l'étais pas. J'ai ajouté manuellement unMyApp-Bridging-header.h fichier et l' pointé dans le champ "En-tête de pontage Objective-C". Cela a fait que mon fichier MyApp-Swift.h a été rempli avec mes classes Swift.

Docs: Importation de Swift dans Objective-C

Nicolai Dahl
la source
oui, pour une raison quelconque, mon fichier ObjC Swift.h a été généré avec des en-têtes de classe Swift uniquement après avoir ajouté un fichier d'en-tête de pontage vide au projet!
Andrew
Pareil ici. Mon code Swift n'a pas été importé dans le fichier * -Swift.h généré jusqu'à ce que j'ajoute un fichier d'en-tête de pontage Objective-C vide.
Nik
12

Voici une autre variante du moduleName-Swift.h non généré.

J'ai décidé d'inclure les graphiques IOS dans mon projet, mais je ne voulais pas mélanger les sources dans le même répertoire, j'ai donc placé le dossier Projet Charts à côté du dossier de projet de mon code. J'ai fait glisser le projet Graphiques dans la barre de navigation de mon projet et inclus le cadre dans la liste des fichiers binaires intégrés de ma cible de projet dans les paramètres généraux du projet et défini le commutateur Embedded Content Contains Swift Code sur Oui dans l' onglet Paramètres de construction de mon projet dans la section Options de construction .

Le fichier moduleName-Swift.h de mon projet ne serait jamais généré, quels que soient les autres commutateurs ou paramètres suggérés ici. Enfin, en utilisant la méthode de Lou Z pour rechercher les fichiers -Swift.h, j'ai vu qu'un fichier Charts-Swift.h était généré profondément dans le répertoire xcode Build de mon projet dans Charts.framework / Headers /

La solution pour utiliser le package Swift ios-charts de Daniel Gindi sans inclure le code dans le répertoire source de mon projet était d'ajouter:

#import "Charts/Charts-Swift.h"

Aux modules cartographiant les données de mon projet.

gjpc
la source
Est-il possible de changer / personnaliser l'info-bulle dans les graphiques IOS? si oui, pouvez-vous donner un exemple?
Amit Chauhan
12

Le nom de fichier est toujours précédé de votre nom cible . Il s'agit du nom du produit, mais il s'agit pratiquement du nom cible. Donc, si vous voulez qu'il se construit pour une nouvelle cible, soyez prêt à vous attendrethat_target-Swift.h fichier.

Une façon de gérer cela est

  1. Ajoutez un préprocesseur pour chacune de vos cibles qui est le nom de votre cible elle-même (sans espaces). Ex.MY_TARGET=1. Ajoutez ceci dans Paramètres du projet-> Paramètres de construction-> Macros de préprocesseur pour chacune de vos cibles.
  2. Si vous utilisez un fichier PCH,

Ajoutez ces lignes dans le fichier PCH

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

L'avantage d'utiliser le fichier PCH est que vous n'avez pas besoin d'inclure les en-têtes partout.

  1. Si vous n'utilisez pas de fichier PCH, ajoutez simplement ces mêmes lignes dans un seul en-tête et incluez cet en-tête partout où vous devez utiliser les classes swift.

Cela devrait très bien fonctionner.

Deepak GM
la source
J'aime vraiment utiliser cette solution plutôt que d'importer l'en-tête directement dans votre source. J'ai une structure de projet compliquée où le même code source est utilisé par plusieurs cibles / projets. Cela évite d'ajouter une instruction #if #else désordonnée partout dans mon code. Merci d'avoir répondu!
Ryan
Cela m'a sauvé la journée. J'ai mis les 5 lignes de code dans un fichier "Something-Swift-Headers.h" (avec includededans). Ensuite, j'importe ce nouveau fichier d'où j'en ai besoin. Je préfère ne pas le mettre à l'intérieur du PCH ou de tout fichier .h pour éviter les dépendances cycliques et utiliser l'en-tête de commodité dans les fichiers .m.
ctietze
C'est faux sur tellement de niveaux. Premièrement, les .pchfichiers sont fortement découragés . Deuxièmement, le nom de fichier contient le nom du produit et PAS du tout le nom cible. Cela pourrait être une coïncidence si c'est la même chose, mais il a utilisé le nom du produit!
Iulian Onofrei
10

Si Xcode génère réellement votre en-tête -Swift.h (au fond de DerivedData) mais qu'il ne fait pas référence à vos classes Swift, assurez-vous que vous avez également défini un en-tête de pontage. La façon dont je lis les documents impliquait que je n'avais besoin que de cela pour appeler Objective-C depuis Swift, mais cela semble être nécessaire pour appeler Swift depuis Objective-C aussi.

Voir ma réponse: https://stackoverflow.com/a/27972946/337392

EDIT: C'est à cause des modificateurs d'accès public vs interne, comme je l'ai finalement trouvé expliqué dans les documents Apple: -

Par défaut, l'en-tête généré contient des interfaces pour les déclarations Swift marquées avec le modificateur public. Il contient également ceux marqués avec le modificateur interne si votre cible d'application a un en-tête de pontage Objective-C.

Échelon
la source
Oui, cela a vraiment aidé. Je ne le savais pas. Je pensais que c'était juste nécessaire pour le cas d'utilisation Obj-C de Swift.
nodepond
Heureux d'aider. J'ai modifié la réponse parce que depuis j'ai découvert la raison de ce comportement.
Echelon
7

Appuyant sur ce que beaucoup de gens ont ici, mais en ajoutant une capture d'écran pertinente. Le code Swift et Obj-C peuvent certainement cohabiter. Ce n'est pas un jeu tout ou rien.

Pour accéder aux fichiers Swift dans votre Objective-C, il vous suffit d'ajouter cet appel à votre fichier Obj-C (dans le fichier .m / implementation):

#import "{product_module_name}-Swift.h"

(Où {product_module_name} représente le nom du module de produit de votre projet). Plutôt que d'essayer de deviner le nom de votre module de produit ou de comprendre des cas d'angle avec des espaces et des caractères spéciaux, allez simplement dans l'onglet des paramètres de construction dans le projet et tapez "nom du module de produit" - l'inspecteur vous révélera le vôtre. La mienne était quelque chose à laquelle je ne m'attendais pas. Découvrez cette capture d'écran si vous êtes confus.

entrez la description de l'image ici

Et pour que le code Obj-c fonctionne dans Swift, il vous suffit d'ajouter un fichier d'en-tête de pontage et d'y importer les en-têtes Obj-C appropriés.

Brian Sachetta
la source
1
N'est-ce pas #import?
Iulian Onofrei
Disons que le nom de mon projet est ABC, alors "ABC-Swift.h", doit exister dans mon projet non? Je ne le trouve pas. Avez-vous besoin de le créer manuellement? Je ne crée pas moi-même de fichiers swift, juste une cacaoterie écrite en swift.
n ° 5
L'en-tête de pontage (dans votre cas, ABC-Swift.h) n'est pas créé automatiquement. Lorsque vous essayez de créer votre premier fichier Swift dans un projet Obj-C, Xcode vous invite normalement à en ajouter un. Vous pouvez également créer vous-même un en-tête de pontage comme indiqué ici (contrôle + f pour 'en-tête de pontage'): developer.apple.com/library/content/documentation/Swift/…
Brian Sachetta
5

La chose la plus importante est que ce fichier est invisible !!! Au moins, c'est dans Xcode6 beta5. Il n'y aura aucun fichier nommé "YourModule-Swift.h" dans votre espace de travail. Assurez-vous simplement que vous avez le nom du module et que le module est défini sur yes, et utilisez-le dans votre classe Objective-C.

user412759
la source
5

Ok, voici toutes les choses dont vous avez vraiment besoin!

1.Supprimez tous les fichiers rapides que vous avez ajoutés et compilez le code sans aucune erreur.

----------

entrez la description de l'image ici

----------

2.Accédez aux paramètres de construction "Projets" et définissez le nom du module de produit. Le projet doit avoir un nom de module de produit qui n'inclut pas d'espaces.

----------

entrez la description de l'image ici

----------

Le module 3.Defines doit être défini sur Yes dans Build Settings, sous Packaging, dans votre projet, et non sur target!

----------

entrez la description de l'image ici

----------

4.Maintenant, créez un fichier rapide ou un contrôleur de vue, dans fichier-> nouveauFichier->

----------

entrez la description de l'image ici

----------

Il demandera de créer un en-tête de pontage, lui permettra d'en faire un. Si vous l'avez refusé une fois, vous devrez ajouter manuellement un -Bridging-Header.h

5.Ajoutez @objc dans le contrôleur pour indiquer au compilateur qu'il existe un fichier swift qui doit être exposé à ObjectiveC

----------

entrez la description de l'image ici

----------

6.Construisez le projet et importez #import "-Swift.h" dans l'un des contrôleurs objectiveC, et cela fonctionnera! Vous pouvez commander-cliquer dessus pour voir le fichier réel!

----------

entrez la description de l'image ici

----------

J'espère que cela t'aides!

Kakshil Shah
la source
>> Vous pouvez commander-cliquer dessus pour voir le fichier réel! C'est cool
Jagan
4

Cette réponse traite du cas d'utilisation où vous pouvez déjà avoir du code Objective-C qui appelle des classes Swift et vous commencez à recevoir cette erreur.

Comment résoudre le problème

Les étapes suivantes ont finalement résolu tous les problèmes pour moi. J'ai lu ci-dessus quelqu'un mentionnant le "poulet et l'oeuf" et c'est exactement ce concept qui m'a conduit à cette procédure. Ce processus explicite montre que l'on doit supprimer tout code Objective-C référençant les classes Swift jusqu'à ce que l'en-tête soit généré.

  1. Mettez en commentaire l'instruction #import "ProductModuleName-Swift.h" dans votre fichier d'implémentation Objective-C
  2. Commentez toutes les références dans le fichier d'implémentation d'Objective-C aux classes Swift
  3. Nettoyer et construire
  4. Résoudre toutes les erreurs / avertissements
  5. Supprimez le commentaire sur l'instruction #import "ProductModuleName-Swift.h"
  6. Nettoyer et construire (avec succès ou corriger les erreurs restantes, vérifiez que vous ne faites référence à aucune classe Swift dans Objective-C à ce stade . Si c'est le cas, commentez-les temporairement)
  7. Vérifiez que "ProductModuleName-Swift.h" est généré par Cmd-clic sur le nom de classe de l'instruction #import "ProductModuleName-Swift.h"
  8. Supprimez le commentaire sur le code faisant référence aux classes Swift dans le fichier d'implémentation d'Objective-C.
  9. Nettoyer et construire comme d'habitude (le "ProductModuleName-Swift.h" doit être généré et votre code Objective-C faisant référence aux classes Swift peut être utilisé comme d'habitude)

Nota Bene: Les réponses sur la modification des espaces en traits de soulignement et le module Définit en OUI comme indiqué ci-dessus s'appliquent toujours lors de l'exécution de ce processus, tout comme les règles spécifiées dans la documentation Apple .

Pont d'en-tête de pont

Dans une erreur, le fichier ProductModuleName-Bridging-Header.h était introuvable pendant le processus de génération. Ce fait a généré une erreur

<inconnu>: 0: erreur: l'en-tête de pontage '/Users/Shared/Working/abc/abc-Bridging-Header.h' n'existe pas

Une inspection plus approfondie de l'erreur a indiqué que le fichier n'existerait jamais à l'emplacement décrit, car il se trouvait en réalité à ( un mauvais chemin )

«/Users/Shared/Working/abc/abc/abc-Bridging-Header.h». une recherche rapide des paramètres de construction cible / projets pour effectuer la correction manuellement et le fichier abc-Swift.h a de nouveau été généré automatiquement.

paramètres de construction

Tommie C.
la source
1
Que se passe-t-il si votre projet est si grand que commenter toutes les références de code rapide dans l'objectif c est impossible?
Andrew Morris
3

Vous devez importer un en-tête dans les classes Objective-C, qui est:

#import “ProductModuleName-Swift.h”

Il est généré automatiquement, sur la référence, il est dit "Tous les fichiers Swift de votre cible seront visibles dans les fichiers Objective-C .m contenant cette instruction d'importation."

Anton
la source
24
Mais, lorsque je fais cela, j'obtiens une erreur de génération, AppName-Swift.h n'existe pas. Alors que AppName-Bridging-Header.h existe.
David Kristensen
5
@DavidKristensen: Avez-vous trouvé une solution?,
Car
2

Un fichier réel dans le projet n'est pas créé ([ProductModuleName] -Swift.h). Cmd + Cliquez sur l'importation soit le génère à la volée (et en mémoire) afin que vous puissiez voir comment le lien est effectué, ou ouvre un fichier quelque part dans un répertoire de cache Xcode, mais ce n'est pas dans le répertoire du projet.

Vous devez définir l' accessoire de projet Définit le module (dans les paramètres de construction de la cible) sur Oui et si le nom de votre module comporte des espaces ou des tirets - utilisez _ dans toutes les importations du fichier [ProductModuleName] -Swift.h.

Vous pouvez l'importer dans tous les fichiers .h et .m où vous utilisez des types rapides ou vous pouvez l'importer dans le .pch.

Donc si mon module (projet) est nommé "Test Project", je l'importerais comme ça, dans le fichier .pch de mon projet (juste là):

#import "Test_Project-Swift.h"
Nikolay Tsenkov
la source
2

Juste un avertissement pour tous ceux qui ont utilisé "." dans le nom du projet. Xcode remplacera le "." avec un trait de soulignement "_" pour la version Swift du fichier d'en-tête de pontage. Curieusement, le Bridging-Header.h généré ne remplace pas les points par des traits de soulignement.

Par exemple, un projet avec le nom My.Project aurait les noms de fichier d'en-tête de pontage suivants.

Bridging-Header.h (Autogénéré)

My.Project-Bridging-Header.h

Swift.h

My_Project.h

J'espère que cela aide toute personne qui a utilisé une menstruation et qui était coincée comme moi. Ce fichier se trouve à l'emplacement suivant.

Macintosh HD / Utilisateurs / utilisateur /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

Prends soin de toi,

Jon

jonthornham
la source
2

Le projet doit avoir un nom de module sans espaces. Définit le module doit être défini sur Oui dans les paramètres de construction, sous Empaquetage. a commenté l'instruction #import:

Si vous rencontrez toujours une erreur lors de l'importation de "ProductModuleName-Swift.h", alors

// # import "ProductModuleName-Swift.h"

qui a révélé un tas d'autres erreurs dans mon code Swift.

Une fois que j'ai corrigé ces nouvelles erreurs et obtenu la construction de la source avec succès, j'ai commenté le #import et le bingo! L'en-tête a été créé et importé correctement :)

j.krissa
la source
Mon problème était que j'avais également des erreurs dans mon code Swift, mais je ne le savais pas jusqu'à ce que je décommente le fichier -Swift.h. Merci!
Will
1

J'ai trouvé une astuce qui fonctionne toujours sur moi.

  1. Créez votre #import "ProductModuleName-Swift.h" dans votre fichier appDelegate.h et dans votre fichier ProductName-Prefix.pch. Si vous ne l'avez pas dans xcode 6, vous pouvez le créer de cette façon Pourquoi ProjectName-Prefix.pch n'est-il pas créé automatiquement dans Xcode 6?
  2. Commande + shift + k pour nettoyer votre code, si vous recevez une erreur concernant votre "ProductModuleName-Swift.h" supprimez-le du fichier appDelegate.h.
  3. Nettoyez à nouveau votre code. Maintenant, tout fonctionnera comme un charme
  4. Si vous recevez à nouveau une erreur concernant le "ProductModuleName-Swift.h", créez à nouveau dans le fichier appDelegate.h et nettoyez à nouveau votre code.

Effectuez ce travail (supprimez et créez le "ProductModuleName-Swift.h" à partir du fichier appDelegate.h et nettoyez votre code) chaque fois que vous recevez cette erreur pour la désactiver.

yannisalexiou
la source
1

J'ai trouvé cette solution

  • Créer SwiftBridge.h
  • mettre #import "ProductModuleName-Swift.h"
  • Rendre ce fichier .h public (important) Sélectionnez le fichier -> Dans Afficher l'inspecteur de fichiers (barre de droite) -> Rendre public

Maintenant vous pouvez

#import "SwiftBridge.h"

au lieu de ProductModuleName-Swift.h

C'est une solution de contournement, pour la prochaine version de Xcode, je pense que ce problème sera résolu. Bonne chance

Tot FOURLEAF
la source
Ça ne marche pas. Je viens de l'essayer. La ligne #import “ProductModuleName-Swift.h”vient juste avec une erreur dans le fichier SwiftBridge.h au lieu du fichier de code Objective-C d'origine.
Supertecnoboff
1

J'avais du mal à déterminer le nom de mon module / l'importation d'objectifs de swift-c. J'ai aussi lu beaucoup d'articles ici.

Mais la réponse définitive pour le nom de votre projet avec tous ses caractères spéciaux inclus (que ce soit '.' Ou un numérique ou un espace) - vous pouvez trouver le texte qui fonctionnera pour vous dans le " Nom du module de produit " sous les paramètres de construction de la cible .

Par exemple, mon nom cible a commencé par un numérique - "1mg" et le champ mentionné ci-dessus a montré "_mg" comme nom de module.

j'ai donc utilisé #import "_mg-Swift.h" et cela a fonctionné.

Le nom du module de produit dans les paramètres de construction de la cible donne le nom de module correct qui fonctionnera pour votre projet

Keroberos
la source
Si vous pouvez modifier un lien vers une capture d'écran, je pourrais modifier votre réponse pour l'afficher pour vous.
SuperBiasMan
1

Dans mon cas, j'ai dû définir la cible de déploiement sur au moins «OS X 10.9» et l'en- -Swift.htête a été généré automatiquement. Gardez à l'esprit que vous pouvez obtenir de nombreux avertissements de dépréciation lorsque vous modifiez la version cible du déploiement, en particulier lorsque vous disposez d'une base de code Objective C plus ancienne et très volumineuse. Dans notre cas, nous avions également beaucoup de travail à faire dans les fichiers XIB et les classes d'affichage.

Rafael Bugajewski
la source
2
Pour les autres - regardez dans les paramètres de construction de votre cible, obtenez le nom exact "MyProject-Swift.h" - c'est ce que vous devez inclure en tant que "#include" MyProject-Swift.h "dans les fichiers Objc appropriés. BTW, this réponse m'a vraiment aidé - travailler à la conversion d'anciennes sources ouvertes ObjectiveC
David H
0

Si vous étiez en mesure de créer un projet auparavant, sans aucun problème lié à l' “ProductModuleName-Swift.h” not founderreur, et que maintenant vous obtenez à nouveau ces erreurs désagréables, la raison pourrait résider dans vos modifications récentes.

Pour moi, c'était par (accidentel) un .swiftencodage de fichier incorrect . Annuler les modifications et les ramener manuellement fait l'affaire.

Yevhen Dubinin
la source
0

Cela peut être un point évident (peut-être trop évident), mais vous devez avoir au moins un fichier rapide dans le projet pour que l'en-tête soit généré. Si vous écrivez du code passe-partout ou de la configuration avec l'intention d'écrire rapidement plus tard, l'importation ne fonctionnera pas.

Alex Brown
la source
0

J'ai dû supprimer le code rapide WatchOS2 de mon projet Objective C. Et seulement après que XCode a proposé de générer -Swift.h

Andrew Marin
la source
0

J'ai eu un problème similaire mais mon projet était en train de compiler avant et j'ai soudainement eu une erreur après le changement de code de quelques fichiers. Il m'a fallu du temps pour comprendre pourquoi j'obtiens l'erreur «Fichier introuvable» pour le fichier myproject-swift.h. Les changements de code que j'avais faits comportaient des erreurs. Xcode n'a pas mis ces erreurs à la place en affichant tout le temps l'erreur "Fichier non trouvé". Puis j'ai obtenu une copie du code de la version précédente et j'ai comparé le nouveau code et le fichier fusionné un par un. Après chaque fusion de fichiers, le projet a trouvé l'erreur. Donc, en fin de compte, si vous avez une erreur dans votre code, Xcode peut simplement afficher `` erreur de fichier introuvable '' pour le fichier myproject-swift.h. Vous avez probablement une erreur de compilation dans votre projet. Nettoyez ces erreurs et cela fonctionnera.

Ram G.
la source
0

Si vous utilisez quelque chose comme des Cocoapods (et que vous travaillez hors de l'espace de travail plutôt que du projet), essayez d'ouvrir le projet et de le construire avant d'ouvrir l'espace de travail et le bâtiment. YMMV.

Warpling
la source
0

Parfois, il vous suffit de désélectionner, puis de définir à nouveau l'appartenance cible dans le fichier obj-c .m.

valeCocoa
la source