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.h
fichier d' en- tête qui est censé exposer les classes Swift soit marquées @objc
ou 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.
la source
Réponses:
Maintenant ça marche.
Fonctionne enfin. Merci à tous pour l'aide :-)
la source
Build Settings
dessousPackaging
, monDefines Module
est réglé surYes
et j'ai créé unProduct Module Name
sans espaces. Le "* -Swift.h" n'est pas généré par XCode 6. ???Defines Module
défini à laYes
fois pour le projet et la cible, et unProduct Module Name
défini, sans espaces , mais je n'arrive pas à générer ce fichier.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
la source
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
#import
dé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
#import
et le bingo! L'en-tête a été créé et importé correctement :)la source
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):
Le trouvera. Si rien dans ce dossier ne correspond, alors Xcode ne le génère pas.
J'utilise Xcode version 6.2 (6C86e)
la source
-Swift.h
et non le nom de mon fichier Swift réel. Je vous remercie!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:
la source
* La seule chose importante est: *
pour utiliser le "Product Module Name" défini dans la cible, suivi de -Swift.h
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 ...
la source
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:
la source
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.
la source
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.
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 un
MyApp-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
la source
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:
Aux modules cartographiant les données de mon projet.
la source
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 attendre
that_target-Swift.h
fichier.Une façon de gérer cela est
MY_TARGET=1
. Ajoutez ceci dans Paramètres du projet-> Paramètres de construction-> Macros de préprocesseur pour chacune de vos cibles.Ajoutez ces lignes dans le fichier PCH
L'avantage d'utiliser le fichier PCH est que vous n'avez pas besoin d'inclure les en-têtes partout.
Cela devrait très bien fonctionner.
la source
include
dedans). 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..pch
fichiers 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!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: -
la source
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):
(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.
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.
la source
#import
?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.
la source
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.
----------
----------
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.
----------
----------
Le module 3.Defines doit être défini sur Yes dans Build Settings, sous Packaging, dans votre projet, et non sur target!
----------
----------
4.Maintenant, créez un fichier rapide ou un contrôleur de vue, dans fichier-> nouveauFichier->
----------
----------
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
----------
----------
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!
----------
----------
J'espère que cela t'aides!
la source
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é.
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
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.
la source
Vous devez importer un en-tête dans les classes Objective-C, qui est:
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."
la source
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à):
la source
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
la source
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 :)
la source
J'ai trouvé une astuce qui fonctionne toujours sur moi.
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.
la source
J'ai trouvé cette solution
Maintenant vous pouvez
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
la source
#import “ProductModuleName-Swift.h”
vient juste avec une erreur dans le fichier SwiftBridge.h au lieu du fichier de code Objective-C d'origine.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é.
la source
Dans mon cas, j'ai dû définir la cible de déploiement sur au moins «OS X 10.9» et l'en-
-Swift.h
tê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.la source
Si vous étiez en mesure de créer un projet auparavant, sans aucun problème lié à l'
“ProductModuleName-Swift.h” not found
erreur, 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
.swift
encodage de fichier incorrect . Annuler les modifications et les ramener manuellement fait l'affaire.la source
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.
la source
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
la source
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.
la source
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.
la source
Parfois, il vous suffit de désélectionner, puis de définir à nouveau l'appartenance cible dans le fichier obj-c .m.
la source