Ini adalah perilaku kompiler yang diharapkan dan untuk alasan yang sangat bagus.
Saya pikir sebagian besar orang mengalami masalah ini disebabkan setelah mereka beralih dari Application Target
ke Framework Target
dan mulai menambahkan header C dan Objective C ke header payung kerangka kerja yang mengharapkannya memiliki perilaku yang sama dengan Bridging Header aplikasi , yang berperilaku berbeda. Header payung sebenarnya dirancang untuk kerangka kerja Swift, obj-c campuran dan tujuannya adalah mengekspos API ke dunia luar yang memiliki kerangka kerja Anda dalam tujuan-c atau c. Itu artinya tajuk yang kami taruh di sana harus ada dalam ruang publik.
Seharusnya tidak digunakan sebagai tempat yang mengekspos header Objective-C / C yang bukan bagian dari kerangka kerja Anda ke kode cepat kerangka kerja Anda. Karena dalam hal ini tajuk ini juga akan diekspos sebagai bagian dari modul kerangka kerja kami ke dunia luar, yang sering kali bukan yang ingin kita lakukan karena merusak modularitas. (Dan itulah mengapa Memungkinkan Non-modular Termasuk dalam Kerangka Modul default untuk TIDAK )
Untuk mengekspos pustaka Objective-C / C ke kode kerangka kerja Anda, kita harus mendefinisikan modul swift terpisah untuk pustaka tersebut. Maka cepat standar import YourLegacyLibrary
dapat digunakan.
Biarkan saya menunjukkan ini pada beberapa skenario umum: menanamkan libxml2
ke dalam kerangka kerja kami.
1. Pertama-tama Anda perlu membuat module.modulemap
file yang akan terlihat seperti ini:
Untuk kerangka OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Untuk kerangka kerja iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Yang perlu dilakukan adalah membungkus header dan header lain yang dirujuk di dalam modul swift, sehingga swift kemudian dapat menghasilkan binding cepat untuk antarmuka C ini.
2. Kemudian di direktori proyek xcode Anda, buat folder SwiftLibXML2
dan letakkan module.modulemap di sana
3. Dalam Pengaturan Bangun , tambahkan $(SDKROOT)/usr/include/libxml2
ke Jalur Pencarian Header
4. Di Bangun Pengaturan , tambahkan $(SRCROOT)/SwiftLibXML2
ke Impor Jalur
5. Di bawah tab General Project , tambahkan libxml2.tbd
ke Linked Frameworks and Libraries .
Sekarang Anda mengimpor modul ini jika diperlukan dengan:
import SwiftLibXML2
(Jika Anda ingin melihat contoh module.map yang lebih lengkap, saya sarankan merujuk modul Darwin.modulemap di /usr/include/module.modulemap
, Anda perlu menginstal alat baris perintah Xcode untuk pergi ke sana, referensi Hilang / usr / termasuk dalam OS X El Capitan )