Importation de Project-Swift.h dans une classe Objective-C… fichier introuvable

129

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"( NewTestAppest le nom du produit et module).

Voici ce que j'ai fait jusqu'à présent:

  1. Dans Define Modules, sélectionné YESpour l'application.
  2. 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.het , AppDelegate.mmais 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:

entrez la description de l'image ici


Erreurs que je rencontre actuellement:

entrez la description de l'image ici

daspianiste
la source
3
Supprimer toutes les données dérivées a ~/Library/Developer/Xcode/DerivedDatafait l'affaire pour moi.
wzhang84
Voici comment j'ai résolu le problème: stackoverflow.com/a/45338549/8102549
schrulnz

Réponses:

158

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 ....

  1. Toute classe à laquelle vous devez accéder dans le fichier .h doit être une déclaration directe comme celle-ci

@class MySwiftClass;

  1. Dans le fichier .m UNIQUEMENT, si le code est dans le même projet (module), vous devez l'importer avec

#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

Bolnad
la source
3
Merci d'avoir répondu. Cela m'a conduit dans la bonne direction. J'ai eu le même problème mais avec un protocole, j'ai donc dû ajouter @protocol MySwiftProtocol au lieu de l'importation dans mon fichier d'en-tête.
palme
dans le fichier .h, la déclaration avant de la classe sans importer le fichier .h a fait l'affaire pour moi. Merci
Sikander
1
Notez que si le nom de votre produit contient un -caractère, le nom du fichier d'en-tête généré sera converti en _. Par exemple, si votre nom de produit est My-App, vous importerez My_App-Swift.h.
dvanoni
1
J'ai trouvé un nouveau moyen de trouver le bon nom de fichier d'en-tête généré: allez à votre cible -> Paramètres de construction -> Rechercher des motsObjective-C Generated Interface Header Name - clés , bingo!
Itachi
2
J'ai fait ces deux choses et je vois toujours le même problème. Pensez-vous que cela a à voir avec la commande?
ArielSD
83

Si le code Swift est à l'intérieur d'un module (comme dans votre cas):

#import <ProductName/ProductModuleName-Swift.h>

Si le code Swift est à l'intérieur du projet (mixte Swift et ObjC):

#import <ProductModuleName-Swift.h>

Dans votre cas, vous devez ajouter cette ligne dans le fichier * .m:

#import <NewTestApp/NewTestApp-Swift.h>

IMPORTANT: regardez le "<" dans l'instruction d'importation

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

ikocel1
la source
Merci d'avoir répondu @ ikocel1. Malheureusement, cela n'a pas fonctionné. J'ai essayé des variantes de <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>et <NewTestApp/ViewController-Swift.h>tout à l'intérieur ViewController.m, mais je continue à obtenir l'erreur "fichier non trouvé", malgré Cleaningle 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.
daspianist
Je n'ai pas encore entré de code Swift dans 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 Swift ViewController.m.
daspianist
1
Je ne sais pas s'il est possible de mélanger directement le code objc et le code swift dans le même fichier.
ikocel1
1
Merci, je suppose que c'était l'hypothèse que j'avais basée sur le document "Mix and Match" d'Apple ... mais je suppose pas dans le fichier réel. Je vous remercie!
daspianist
6
Je n'ai pas compris pourquoi cette réponse avait été approuvée. Oui, c'est correct suite à la documentation mais pratiquement ne fonctionne pas pour moi aussi. Même dans la question, il est évident que l'utilisateur utilise la syntaxe telle qu'elle est recommandée dans cette réponse, mais obtient toujours une erreur.
Darius Miliauskas
54

Comment j'ai réussi à importer Swift dans objective-c:

  • Définit le module réglé sur OUI (sur le projet - pas sur la cible)
  • Nom du module de produit défini (sur la cible - pas sur le projet)
  • Dans votre ViewController.m importez le code SWIFT avec:

    #import "MyProductModuleName-Swift.h"
  • Ajoutez un fichier rapide à votre projet objective-c (Fichier -> Nouveau -> Swift) et Xcode créera l'en-tête de pontage d'objectif-c vers Swift, mais cela est crucial pour que cela fonctionne également dans l'autre sens - apparemment.

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

holm50
la source
Excellentes notes. J'ajouterais que la cible de test est son propre module et aura son propre en-tête nommé "<#TestTargetName #> - Swift.h" et que tous les espaces dans les noms de cible seront convertis en espaces.
Chuck Krutsinger
@ holm51 désolé de demander ça, mais où est Define Moduleet Product Module Name?
matchifang le
tirets -dans le nom seront convertis en underscores _et
CyberMew
11

En 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.

Pétershine
la source
Salut Peter, où pouvez-vous trouver ce fichier? Ou est-il généré automatiquement par xcode? De plus, devez-vous configurer votre fichier pod différemment en raison de ce changement?
Rob Norback
@RobNorback Si je ne me trompe pas, vous pouvez simplement écrire 'import "Product-Swift.h" dans le fichier d'en-tête / d'implémentation Obj-C pour voir l'effet, sans rien faire de plus. Assurez-vous que toutes les configurations sont activées dans les paramètres de votre projet pour le mixage Swift et Obj-C. De plus, je n'ai toujours pas rencontré de problème avec Podfile. S'il vous plaît laissez-moi savoir si je vois les choses différemment.
petershine
Merci, j'avais passé des heures à essayer de déboguer cela, et le problème était en effet que chacun des modules de mon projet générait son propre -Swift.hfichier 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.
Apoorv Khatreja
@ApoorvKhatreja comment les avez-vous forcés à faire ça? Vous avez écrit le nom du fichier explicitement?
Amit Raz
8

Passé une heure sur ce problème, suivre ces étapes vous aidera à comprendre ce qui manque:

  1. Ouvrez la préférence Xcode et accédez au dossier DerivedData
  2. Rechercher "swift.h" dans le Finder
  3. Si vous ne trouvez aucun fichier project-swift.h, ce fichier n'a pas été généré. Vous devez généralement ajouter @objc à l'une de vos classes swift et réussir à créer l'application, ce n'est qu'alors que Xcode générera ce fichier
  4. Si vous avez trouvé le fichier "xxx-swift.h", assurez-vous que votre instruction d'importation contient le nom correct.

comment localiser le fichier swift

Jakehao
la source
Veuillez ne pas ajouter la même réponse à plusieurs questions . Répondez à la meilleure et marquez le reste comme des doublons, une fois que vous gagnez suffisamment de réputation. S'il ne s'agit pas d'un doublon, adaptez le message à la question et indiquez la suppression.
Bhargav Rao
Merci pour ça! J'ai changé le nom d'affichage de mon application (pas celui de la cible) et l'en-tête Swift a également changé de nom. C'était la seule façon pour moi de trouver ce qui se passait.
Lucas P.
Merci d'avoir publié une réponse. Les captures d'écran et la forme précise des points me font immédiatement défiler en arrière + regardé + terminé ma recherche ... problème résolu!
dklt
6

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.

Josh B
la source
2
Où se trouve ce fichier? Je regarde autour de moi et je n'ai rien trouvé
Amit Raz
5

-Swift.hdoit être créé automatiquement par Xcode si le code Swift expose une API via @objcou @objcMembers[À propos]

Habituellement, un emplacement ressemble à

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Il peut être modifié par

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

Par défaut, la valeur est $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

yoAlex5
la source
2

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.

Ventilateur YSR
la source
3
Mais comment l'importer dans un fichier .h si j'ai besoin d'une classe Swift dans l'en-tête objc?
Alexander Danilov
1

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!

Artem Loginov
la source
Dans mon cas, j'ai fait face au problème car j'avais décidé de reporter la migration vers Swift 3 proposée par Xcode. En conséquence, Xcode n'a pas été en mesure de créer des fichiers source Swift et n'a pas généré les en-têtes à inclure.
iutinvg
1

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

Gurunath Sripad
la source
1

Importer le fichier d'en-tête, c'est-à-dire

#import "<ProjectName>-Swift.h" 

dans le fichier .h a généré une erreur, indiquant:

-Swift.h 'fichier introuvable

et la construction a échoué.

Utilisez plutôt:

#import "<ProjectName>-Swift.h"

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.

Claytog
la source
1

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"

opochtovy
la source
superbe solution
iOS Lifee
1

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.

Technologie Silversky
la source
0

Si vous avez plusieurs cibles, assurez-vous d'avoir construit tous les frameworks

Same7Farouk
la source
0

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.plistfichier 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.plistfichier 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.

Beltalowda
la source
0

Assurez-vous que votre classe swift a la déclaration publique et étend NSObject:

public class MySwiftClass: NSObject {
    //...
}

L'importation doit fonctionner avec des guillemets, pas des crochets, si la classe swift est dans le même projet.

Rubans Michael
la source
0

si vous ajoutez d'abord un fichier Swift, n'oubliez pas d'ajouter un fichier swift à votre cible ..., dans la colonne de gauche

JethroYe
la source