J'ai un projet qui a été démarré en Objective-C et j'essaie d'importer du code Swift dans les mêmes fichiers de classe dans lesquels j'ai précédemment écrit Objective-C.
J'ai consulté la documentation Apple sur l'utilisation de Swift et Objective-C dans le même projet, ainsi qu'une question SO comme celle-ci, mais toujours en vain: je continue à obtenir l'erreur de fichier introuvable après l'installation #import "NewTestApp-Swift.h"
( NewTestApp
est le nom du produit et module).
Voici ce que j'ai fait jusqu'à présent:
- Dans
Define Modules
, sélectionnéYES
pour l'application. - Veillé à ce que le nom du module de produit ne contienne aucun espace (voir capture d'écran ci-dessous la question)
Je l' ai essayé d' utiliser l' #import "NewTestApp-Swift.h"
intérieur ViewController.m
, ViewController.h
et , AppDelegate.m
mais aucun d'entre eux a travaillé.
Que fais-je d'autre de manière incorrecte? Merci de votre aide.
Capture d'écran des paramètres:
Erreurs que je rencontre actuellement:
~/Library/Developer/Xcode/DerivedData
fait l'affaire pour moi.Réponses:
Je rencontrais le même problème et je ne pouvais pas importer mon projet rapidement dans les classes obj-c. En utilisant Xcode 6, (devrait fonctionner pour Xcode 6+) et a pu le faire de cette manière ....
@class MySwiftClass;
#import "ProductModuleName-Swift.h"
Lien vers la documentation Apple à ce sujet
https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c
la source
-
caractère, le nom du fichier d'en-tête généré sera converti en_
. Par exemple, si votre nom de produit estMy-App
, vous importerezMy_App-Swift.h
.Objective-C Generated Interface Header Name
- clés , bingo!Si le code Swift est à l'intérieur d'un module (comme dans votre cas):
Si le code Swift est à l'intérieur du projet (mixte Swift et ObjC):
Dans votre cas, vous devez ajouter cette ligne dans le fichier * .m:
IMPORTANT: regardez le "<" dans l'instruction d'importation
https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
la source
<NewTestApp-Swift/NewTestApp-Swift.h>
,<NewTestApp/NewTestApp-Swift.h>
et<NewTestApp/ViewController-Swift.h>
tout à l'intérieurViewController.m
, mais je continue à obtenir l'erreur "fichier non trouvé", malgréCleaning
le projet à chaque fois après avoir essayé une combinaison. J'ai inclus une capture d'écran dans le corps de la question au cas où cela aiderait.ViewController.m
. J'ai seulement essayé d'importer les en-têtes en premier pour essayer de faire accepter le code Swift. Je vais mélanger et faire correspondre les codes Objective-C et SwiftViewController.m
.Comment j'ai réussi à importer Swift dans objective-c:
Dans votre ViewController.m importez le code SWIFT avec:
Pour la dernière pièce de ce puzzle, merci à Swiftoverload pour m'avoir informé de l'ajout d'un fichier Swift via l'interface graphique Xcode et pas seulement de glisser-déposer des fichiers swift existants dans mon projet pour le faire fonctionner: http://nikolakirev.com/blog / using-swift-in-objective-c-project
la source
Define Module
etProduct Module Name
?-
dans le nom seront convertis en underscores_
etEn utilisant Xcode 8.2.1 et si vous regardez Project > Build Settings> Objective-C Generated Interface Header Name , il n'y a qu'un seul fichier d'en-tête nommé comme Product -Swift.h
Cela signifie qu'au lieu d'importer chaque module séparément du fichier .m Objective-C, en utilisant un fichier -Swift.h individuel, vous importez simplement un produit -Swift.h qui a agrégé tous les modules Swift.
J'ai rencontré le même problème en recherchant un moyen traditionnel d'importer des modules séparément, mais la version actuelle de Xcode et Swift 3 l'a changé pour n'utiliser qu'un seul en-tête pour l'importation de tous les modules.
la source
-Swift.h
fichier d'en-tête. Les forcer tous (j'ai 5 cibles) à utiliser un fichier d'en-tête commun a résolu le problème pour moi.Passé une heure sur ce problème, suivre ces étapes vous aidera à comprendre ce qui manque:
la source
J'avais des problèmes pour importer Swift dans un projet Objective-C. À la fin, j'ai regardé dans le dossier Derivied Data pour vérifier ce que Xcode 7 générait. Le nom du fichier était complètement différent de celui auquel je m'attendais.
Une fois que j'ai eu le nom de fichier réel, je l'ai importé et le projet a pu se construire.
la source
-Swift.h
doit être créé automatiquement par Xcode si le code Swift expose une API via@objc
ou@objcMembers
[À propos]Habituellement, un emplacement ressemble à
Il peut être modifié par
Par défaut, la valeur est
$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
la source
DÉFINIR LES MODULES: OUI et importer "ProjectName-Swift.h" dans le fichier .m de la classe Obj-C
Cela a fonctionné pour moi pour accéder aux classes Swift dans Obj-c.
la source
J'avais rencontré le même problème avec mon équipe lorsqu'elle travaillait sur un projet en utilisant git. Un développeur n'a pas mis à jour Xcode vers la dernière version (7.3) qui était requise pour la dernière version de Swift 2.2. Ainsi, le compilateur n'a pas reconnu la nouvelle syntaxe Swift et n'a pas pu générer d'interface pour la bibliothèque Swift (projectname-swift.h). Vérifiez si la version Xcode est la dernière!
la source
Pendant le développement, il se peut que vous ayez une classe Swift qui n'est pas complètement implémentée en raison de certaines erreurs de syntaxe. Le fichier d'en-tête swift ne pourra être utilisé que si tous les fichiers swift sont exempts d'erreurs.
Assurez-vous qu'il n'y a pas d'erreurs de syntaxe dans les fichiers swift, puis essayez d'importer l'en-tête swift dans le fichier objectif-c
la source
Importer le fichier d'en-tête, c'est-à-dire
dans le fichier .h a généré une erreur, indiquant:
et la construction a échoué.
Utilisez plutôt:
dans le fichier .m, et même si la même erreur apparaît, l'exécution du projet supprime quand même l'erreur.
Les classes Swift sont alors disponibles dans le fichier .m.
la source
J'ai rencontré le problème avec le nom du projet (cible). Il comprenait le symbole "-". La décision était donc la suivante: si le nom du projet est "Test-App", alors le nom de la classe importée est "Test_App-Swift.h"
la source
Si le nom de votre application a un caractère spécial, utilisez _ pour le caractère spécial.
Par exemple, si le nom de votre application est Name "Test App®"
Ensuite, vous pouvez importer le fichier swift par "Test_App_-Swift.h".
L'espace et ® sont remplacés par _ lors de l'importation.
la source
Si vous avez plusieurs cibles, assurez-vous d'avoir construit tous les frameworks
la source
Xcode 11
J'ai rencontré ce problème lors de la construction sur Xcode 11. Il m'a fallu un peu de temps pour comprendre ce qui n'allait pas, mais essentiellement, j'avais modifié le paramètre "Nom d'affichage" dans l'onglet "Général" de la cible au lieu de changer directement dans le
Info.plist
fichier via le Onglet "Info" sur la cible.Cela a conduit Xcode 11.5 à réécrire / créer un tas de nouveaux paramètres de construction personnalisés et à modifier le nom du module d'application et du produit .app intégré. Dans ce cas , le nouveau nom d'affichage a également une barre oblique (
/
caractère) dans ce qui peut en fin de compte pourquoi il n'a pas été construit (voir @Silversky technologie de réponse ).Quoi qu'il en soit, j'ai résolu ce problème en annulant toutes les modifications automatiques de Xcode 11.5 dans le fichier de projet et en apportant manuellement la même modification au nom d'affichage du bundle dans le
Info.plist
fichier et tout fonctionne parfaitement.J'aurais aimé qu'il vous dise qu'il faisait des trucs comme celui-ci avant de le faire et le fait sans votre consentement.
la source
Assurez-vous que votre classe swift a la déclaration publique et étend NSObject:
L'importation doit fonctionner avec des guillemets, pas des crochets, si la classe swift est dans le même projet.
la source
si vous ajoutez d'abord un fichier Swift, n'oubliez pas d'ajouter un fichier swift à votre cible ..., dans la colonne de gauche
la source