web-dev-qa-db-fra.com

Échec de l'importation de l'en-tête de pontage

J'ai lu beaucoup de questions et de réponses qui traitent d'un problème similaire, mais je n'ai pas encore trouvé de solution. Si quelqu'un pouvait faire la lumière, ce serait merveilleux.

J'ai créé un projet Swift et je souhaite maintenant le combiner avec un certain Objective-C. Mon "en-tête de pontage d'échec d'importation" n'a lieu que lorsque je tente # d'importer mon fichier Chartboost.h. Donc, tant que je n'ai rien dans mon fichier d'en-tête de pontage, Xcode le trouve et ne me pose aucun problème. Mais une fois que j'ajoute ceci:

#import <Chartboost/Chartboost.h>

Je reçois l’erreur avec 38 autres erreurs indiquant «Erreur du compilateur Swift - La définition de fonction n’est pas autorisée ici». 

J'ai correctement importé mon framework. Et mon chemin de recherche de cadre est correct. Et ce n'est que lorsque j'importe le cadre Chartboost. UIKit et Foundation fonctionnent bien.

Voici ce que j'ai fait en amont du problème ... Tout d'abord, j'ai créé un nouveau fichier Obj-C, puis j'ai cliqué sur "Oui quand Xcode m'a ouvert une fenêtre contextuelle lui demandant s'il pouvait configurer un en-tête de pontage. Ceci a créé" FunFacts -Bridging-Header.h "

Je me suis ensuite assuré que le chemin de l'en-tête de pontage Objective-C était correct sous Swift Compiler - Génération de code. 

J'ai même mis dans un chemin très spécifique /Users/me/Desktop/FunFacts/FunFacts-Bridging-Header.h et il dit toujours "Échec de l'importation".

J'ai également défini le module Defines sur "Oui" (car j'ai entendu dire que cela pourrait aider). Et mon nom de module de produit est FunFacts.

Pourquoi FunFacts-Bridging-Header.h ne parvient-il pas à importer lorsque j'essaie d'ajouter #import?

27
Alan Scarpa

J'ai compris 2 solutions!

1) Ce n’est pas la meilleure façon de le faire, mais je copie et colle tout mon code de mon fichier Chartboost.h dans mon fichier Bridging-Header.h au lieu de l’importer. Cela a fonctionné. Mais je savais qu'il y avait un meilleur moyen, alors j'ai continué à chasser ...

2) Je pense que la solution correcte est ce que j'ai fait ensuite. Les chemins de recherche de structure de mon projet (non cible) étaient vides. J'ai donc ajouté le chemin d'accès au SDK Chartboost comme suit:/Utilisateurs/moi/Bureau/Applications/SDK/Chartboost
Maintenant, il fonctionne sans problème et je n’ai pas à tout copier/coller dans l’en-tête de pontage. Tout ce qui était nécessaire était 

#import <Chartboost/Chartboost.h>

Si quelqu'un a un problème similaire, lisez ce que j'ai fait dans ma question, puis faites un suivi avec cette réponse. 

15
Alan Scarpa

J'ai répondu à cela dans un autre article: Problèmes d'intégration de Chartboost avec XCode 6.1

EXPLICATION:

Il semble que certains pods et bibliothèques ne importent pas les frameworks de base car ils s'attendent à ce que votre code les ait déjà. Cela ne fonctionne pas avec Swift, car la manière d'importer les frameworks a changé . Tout ce que vous avez à faire est d'ajouter les frameworks nécessaires dans votre fichier d'en-tête de pontage.

RÉPONSE:

Cela dépend des erreurs que le compilateur génère . S'il se plaint de NSObject, NSString, etc ..., vous devez ajouter #import <Foundation/Foundation.h> en haut de votre fichier d'en-tête de pontage.

S'il se plaint de UIView, UIButton, etc ..., vous devez ajouter #import <UIKit/UIKit.h> en haut de votre fichier d'en-tête de pontage.

41
xemacobra

Le problème comme le vôtre m'a laissé perplexe ... Mais j'ai trouvé une solution. 

#import <Foundation/Foundation.h>

Vous devriez mettre ce code (↑) avant votre code ..__ C'est juste ma solution ().

#import <Foundation/Foundation.h>
#import <Chartboost/Chartboost.h>

Bonne chance!

6
Hirokio

Voici comment je l'ai résolu (et fonctionne!):

  1. Créez votre fichierProjectName-Bridging-Header.h à la racine de votre projet.
  2. Incluez dans ce fichier les fichiers .h des classes que vous souhaitez exposer et utiliser dans votre projet Swift
  3. Allez dans votre projet-> Paramètres de construction-> Chemins de recherche et définissez sur Oui la clé "Toujours rechercher les chemins d'utilisateurs".
  4. Définissez "Chemins de recherche d'utilisateur en-tête" sur le chemin racine de votre projet.

C'est tout.

Apparemment, Xcode manque les dossiers tiers quand ils sont copiés dans votre projet 

Je suis sur Xcode 6.3, Swift 1.2.

6
PacoGV

La réponse est vraiment très simple.

Assurez-vous d’ajouter votre chemin d’entête de pontage dans Swift_OBJC_BRIDGING_HEADER sous la section cible au lieu de la section projet.

5
Dipesh Patel

Si vous utilisez CocoaPods, cela pourrait vous faire gagner du temps ... 1. La première chose que vous devez faire est de vérifier votre Podfile:

target 'YourProjTests' do
    inherit! :search_paths
end

target 'YourProjUITests' do
    inherit! :search_paths
end

2) Ouvrez la configuration baseproj et définissez les objectifs corrects dans Pods-Proj.debug, voir image ci-jointe:  enter image description here

3
Kalyan Trandafil

Avait un problème presque identique et a trouvé une solution qui a fonctionné pour moi.

Mon problème était que l'en-tête de pontage n'était pas dans TOUTES mes cibles.

 Project Bridging Header


C'était dans mon projet mais pas dans ma cible UnitTest. Je l'ai donc ajouté à mon UITest et à UnitTest et cela a commencé à fonctionner sans problème.

 Testing Target


2

Si vous avez ces lignes dans votre en-tête de pontage:

#ifndef Bridging_Header_h
#define Bridging_Header_h

#endif /* Bridging_Header_h */

Supprimez-les simplement, cela résoudra les problèmes de Foundation et de UIKit.

2

Un cas est que si import <Chartboost+Extention/Chartboost+Extention.h>,

La bonne façon est de import <Chartboost**_**Extention/Chartboost+Extention.h>

Juste parce que Pod build va changer le nom de framework de Chartboost+Extention en Chartboost_Extention

0
JerryZhou