Questo è un comportamento previsto del compilatore e per un'ottima ragione.
Penso che la maggior parte delle persone in esecuzione in questo questioni è causata dopo si passa da Application Target
a Framework Target
e iniziare l'aggiunta di C e le intestazioni Obiettivo C in del framework intestazione ombrello in attesa di avere un stesso comportamento di Bridging colpo di testa di applicazione , che si comporta in modo diverso. L'header ombrello è in realtà designato per un framework misto rapido, obj-c e il suo scopo è quello di esporre le API al mondo esterno che il tuo framework ha in object-c o c. Ciò significa che le intestazioni che inseriamo dovrebbero essere di dominio pubblico.
Non deve essere utilizzato come luogo che espone le intestazioni Objective-C / C che non fanno parte del framework al codice rapido del framework. Perché in quel caso queste intestazioni saranno anche esposte come parte del nostro modulo quadro al mondo esterno, che spesso non è ciò che vogliamo fare poiché rompe la modularità. (Ed è esattamente questo il motivo per cui le impostazioni predefinite per le inclusioni non modulari nei moduli Framework sono NO )
Al fine di esporre la libreria Objective-C / C al codice rapido del framework, è necessario definire un modulo rapido separato per tale libreria. Quindi è import YourLegacyLibrary
possibile utilizzare uno swift standard .
Consentitemi di dimostrarlo in uno scenario tipico: l'integrazione libxml2
nel nostro framework.
1. È innanzitutto necessario creare un module.modulemap
file che apparirebbe in questo modo:
Per il framework OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Per 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 *
}
Tutto ciò che fa è che avvolge l'intestazione e tutte le altre intestazioni a cui fa riferimento all'interno del modulo swift, in modo che swift sarà in grado di generare i collegamenti rapidi per queste interfacce C.
2. Quindi, nella directory del progetto xcode, creare una cartella SwiftLibXML2
e inserire questo modulo.modulemap lì
3. In Impostazioni build , aggiungi $(SDKROOT)/usr/include/libxml2
a Percorsi di ricerca intestazione
4. In Impostazioni build , aggiungi $(SRCROOT)/SwiftLibXML2
a Importa percorsi
5. Nella scheda Generale del progetto , aggiungi libxml2.tbd
a Strutture e librerie collegate .
Ora importa questo modulo dove necessario con:
import SwiftLibXML2
(se vuoi dare un'occhiata a un esempio di module.map più completo, suggerirei di fare riferimento a module.modulemap di Darwin su /usr/include/module.modulemap
, avresti bisogno di avere gli strumenti da riga di comando Xcode installati per andare lì, riferimento Missing / usr / include in OS X El Capitan )