Il s'agit d'un comportement de compilateur attendu et pour une très bonne raison.
Je pense que la majorité des gens qui courent dans ce problèmes est dû après passer de Application Target
à Framework Target
et commencer à ajouter C et en- têtes Objective C dans de cadre en- tête parapluie attendant qu'il ait un même comportement que Bridging - tête de l' application , qui se comporte différemment. L'en-tête de parapluie est en fait désigné pour le cadre mixte rapide et obj-c et son but est d'exposer les API au monde extérieur que votre cadre a en objectif-c ou c. Cela signifie que les en-têtes que nous y mettons devraient être de portée publique.
Il ne doit pas être utilisé comme un endroit qui expose les en-têtes Objective-C / C qui ne font pas partie de votre framework au code rapide de votre framework. Parce que dans ce cas, ces en-têtes seront également exposés dans le cadre de notre module de cadre au monde extérieur, ce qui n'est souvent pas ce que nous voulons faire car il rompt la modularité. (Et c'est exactement la raison pour laquelle Autorise les modules non modulaires inclus dans le cadre des modules par défaut à NO )
Afin d'exposer la bibliothèque Objective-C / C à votre code Swift de framework, nous devons définir un module Swift distinct pour cette bibliothèque. Ensuite, un swift standard import YourLegacyLibrary
peut être utilisé.
Permettez-moi de le démontrer sur un scénario typique: l'intégration libxml2
dans notre cadre.
1. Vous devez d'abord créer un module.modulemap
fichier qui ressemblerait à ceci:
Pour le framework OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Pour le framework iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Tout ce qu'il fait, c'est qu'il enveloppe l'en-tête et tous les autres en-têtes auxquels il fait référence dans le module swift, afin que swift puisse ensuite générer les liaisons swift pour ces interfaces C.
2. Ensuite, dans votre répertoire de projet xcode, créez un dossier SwiftLibXML2
et placez-y ce module.modulemap
3. Dans Build Settings , ajoutez $(SDKROOT)/usr/include/libxml2
aux en- têtes des chemins de recherche
4. Dans Build Settings , ajoutez $(SRCROOT)/SwiftLibXML2
à Import Paths
5. Sous l' onglet Général du projet , ajoutez-le libxml2.tbd
aux cadres et bibliothèques liés .
Maintenant, vous importez ce module si nécessaire avec:
import SwiftLibXML2
(si vous voulez regarder un exemple de module.map plus complet, je suggérerais de référencer le module.modulemap de Darwin à /usr/include/module.modulemap
, vous auriez besoin d'avoir des outils de ligne de commande Xcode installés pour y aller, référence Missing / usr / include dans OS X El Capitan )