นี่เป็นพฤติกรรมของคอมไพเลอร์ที่คาดหวังและด้วยเหตุผลที่ดีมาก
ผมคิดว่าคนส่วนใหญ่ทำงานเป็นปัญหานี้จะเกิดขึ้นหลังจากที่พวกเขาเปลี่ยนจากApplication Target
ไปFramework Target
และเริ่มต้นการเพิ่ม C และส่วนหัววัตถุประสงค์ C ในกรอบของหัวร่มคาดหวังว่ามันจะมีพฤติกรรมเช่นเดียวกับโปรแกรม Bridging ส่วนหัวซึ่งทำงานแตกต่างกัน ส่วนหัวของร่มนั้นได้รับการกำหนดให้ผสมกรอบอย่างรวดเร็ว obj-c และจุดประสงค์ของมันคือการเปิดเผย API ไปสู่โลกภายนอกที่กรอบงานของคุณมีในวัตถุประสงค์ -c หรือ c นั่นหมายความว่าส่วนหัวที่เราใส่ควรอยู่ในขอบเขตสาธารณะ
ไม่ควรใช้เป็นสถานที่ที่แสดงถึงส่วนหัว Objective-C / C ที่ไม่ได้เป็นส่วนหนึ่งของกรอบงานของคุณไปยังรหัสที่รวดเร็วของกรอบงานของคุณ เพราะในกรณีนี้ส่วนหัวเหล่านี้จะได้รับการเปิดเผยเป็นส่วนหนึ่งของโมดูลกรอบงานของเรากับโลกภายนอกซึ่งมักจะไม่ใช่สิ่งที่เราต้องการทำเพราะมันทำลายส่วนย่อย (และนั่นคือเหตุผลที่อนุญาตให้ใช้แบบไม่รวมในค่าเริ่มต้นเป็นโมดูลกรอบไม่ใช่ )
ในการแสดงไลบรารี่ Objective-C / C ไปยังโค้ดเฟรมเวิร์กของคุณเราควรกำหนดโมดูล swift แยกต่างหากสำหรับไลบรารี่ดังกล่าว จากนั้นสวิฟท์มาตรฐานimport YourLegacyLibrary
สามารถใช้ได้
ให้ฉันแสดงสิ่งนี้ในสถานการณ์ทั่วไป: ฝังlibxml2
เข้าไปในกรอบงานของเรา
1.ก่อนอื่นคุณต้องสร้างmodule.modulemap
ไฟล์ซึ่งจะมีลักษณะดังนี้:
สำหรับกรอบ OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
สำหรับเฟรมเวิร์ก iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
สิ่งที่มันทำคือห่อหุ้มส่วนหัวและส่วนหัวอื่น ๆ ที่อ้างถึงในโมดูล swift ดังนั้น swift จะสามารถสร้างการเชื่อมแบบ swift สำหรับอินเตอร์เฟส C เหล่านี้ได้
2.จากนั้นในไดเรกทอรีโครงการ xcode ของคุณสร้างโฟลเดอร์SwiftLibXML2
และใส่ module.modulemap นี้ไว้
3.ในการตั้งค่าการสร้างเพิ่ม$(SDKROOT)/usr/include/libxml2
ไปยังเส้นทางการค้นหาส่วนหัว
4.ในBuild Settingsเพิ่ม$(SRCROOT)/SwiftLibXML2
ไปที่Import Paths
5.ภายใต้โครงการทั่วไปแท็บเพิ่มlibxml2.tbd
เพื่อกรอบที่เชื่อมโยงและห้องสมุด
ตอนนี้คุณนำเข้าโมดูลนี้เมื่อจำเป็นด้วย:
import SwiftLibXML2
(ถ้าคุณต้องการดูตัวอย่าง module.map ที่สมบูรณ์ยิ่งขึ้นฉันขอแนะนำให้อ้างอิง module.modulemap ของดาร์วินที่/usr/include/module.modulemap
คุณจะต้องมีเครื่องมือบรรทัดคำสั่ง Xcode ติดตั้งเพื่อไปที่นั่นอ้างอิงMissing / usr / include ใน OS X El Capitan )