Dies ist ein erwartetes Compilerverhalten und das aus einem sehr guten Grund.
Ich denke , dass die Mehrheit der Menschen in diese Probleme laufen verursacht wird , nachdem sie von Schalter Application Target
zu Framework Target
und starten Sie das Hinzufügen C und Objective - C - Header in Rahmen des Umbrella - Header erwartet , dass es ein gleiches Verhalten wie haben Anwendung Bridging - Header , das unterschiedlich verhält. Der Umbrella-Header ist eigentlich für ein gemischtes schnelles obj-c-Framework vorgesehen und dient dazu, die APIs der Außenwelt auszusetzen, die Ihr Framework in Ziel-c oder c hat. Das bedeutet, dass die Header, die wir dort platzieren, im öffentlichen Bereich sein sollten.
Es sollte nicht als Ort verwendet werden, an dem Objective-C / C-Header, die nicht Teil Ihres Frameworks sind, für den schnellen Code Ihres Frameworks verfügbar gemacht werden. Denn in diesem Fall werden diese Header auch als Teil unseres Framework-Moduls der Außenwelt ausgesetzt, was wir oft nicht wollen, da es die Modularität bricht. (Und genau aus diesem Grund ist die Standardeinstellung für nicht modulare Einschlüsse in Framework-Modulen standardmäßig NO. )
Um die Objective-C / C-Bibliothek für Ihren Framework-Swift-Code verfügbar zu machen, sollten Sie ein separates Swift-Modul für diese Bibliothek definieren. Dann kann ein Standard-Swift import YourLegacyLibrary
verwendet werden.
Lassen Sie mich dies anhand eines typischen Szenarios demonstrieren: Einbettung libxml2
in unser Framework.
1. Sie müssen zuerst eine module.modulemap
Datei erstellen , die folgendermaßen aussieht:
Für das OSX-Framework:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Für iOS-Framework:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Alles, was es tut, ist, dass es den Header und alle anderen Header, auf die es verweist, innerhalb des Swift-Moduls einschließt, so dass Swift dann die Swift-Bindungen für diese C-Schnittstellen generieren kann.
2. Erstellen Sie dann in Ihrem xcode-Projektverzeichnis einen Ordner SwiftLibXML2
und legen Sie diese module.modulemap dort ab
3. In Build - Einstellungen , fügen Sie $(SDKROOT)/usr/include/libxml2
auf Header - Suchpfade
4. In Build - Einstellungen hinzufügen, $(SRCROOT)/SwiftLibXML2
um Import - Pfade
5. Unter Project Allgemein Registerkarte hinzufügen , libxml2.tbd
um Linked Frameworks und Bibliotheken .
Jetzt importieren Sie dieses Modul bei Bedarf mit:
import SwiftLibXML2
(Wenn Sie sich ein vollständigeres Beispiel für module.map ansehen möchten, würde ich vorschlagen, auf Darwins module.modulemap zu verweisen. Dazu /usr/include/module.modulemap
müssen Xcode-Befehlszeilentools installiert sein. Verweisen Sie auf Missing / usr / include in OS X El Capitan )