यह एक अपेक्षित संकलक व्यवहार और एक बहुत अच्छे कारण के लिए है।
मुझे लगता है कि इस मुद्दे पर चलने वाले अधिकांश लोगों के कारण होता है कि वे स्विच Application Target
करने Framework Target
और सी और ऑब्जेक्टिव सी हेडर को फ्रेमवर्क के छाता हेडर में जोड़ना शुरू कर देते हैं और यह अपेक्षा करते हैं कि यह एप्लिकेशन के ब्रिजिंग हैडर के समान व्यवहार करे , जो अलग-अलग व्यवहार करता है। छाता हेडर वास्तव में मिश्रित स्विफ्ट, ओबज-सी फ्रेमवर्क के लिए नामित किया गया है और इसका उद्देश्य बाहरी दुनिया के एपीआई को उजागर कर रहा है जो कि आपके ढांचे का उद्देश्य-सी या सी है। इसका मतलब है कि हमारे द्वारा लगाए गए हेडर सार्वजनिक दायरे में होने चाहिए।
इसका उपयोग ऐसी जगह के रूप में नहीं किया जाना चाहिए जो उद्देश्य-सी / सी हेडर को उजागर करता है जो आपके ढांचे के स्विफ्ट कोड में आपके ढांचे का हिस्सा नहीं हैं। क्योंकि उस स्थिति में ये हेडर हमारे फ्रेमवर्क मॉड्यूल के बाहरी दुनिया के हिस्से के रूप में भी सामने आएंगे, जो कि हम अक्सर ऐसा नहीं करना चाहते हैं क्योंकि यह मोड्यूलरिटी को तोड़ता है। (और यही वजह है कि गैर-मॉड्यूलर को फ्रेमवर्क मॉड्यूल में शामिल करने की अनुमति नहीं है )
आपके फ्रेमवर्क स्विफ्ट कोड के लिए ऑब्जेक्टिव-सी / सी लाइब्रेरी को एक्सपोज करने के लिए, हमें ऐसी लाइब्रेरी के लिए एक अलग स्विफ्ट मॉड्यूल को परिभाषित करना चाहिए। फिर एक मानक स्विफ्ट 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 *
}
यह सब यह है कि यह हेडर को लपेटता है और किसी भी अन्य हेडर को यह स्विफ्ट मॉड्यूल के अंदर संदर्भित करता है, ताकि स्विफ्ट फिर इन सी इंटरफेस के लिए स्विफ्ट बाइंडिंग उत्पन्न कर सके।
2. इसके बाद अपने xcode प्रोजेक्ट डायरेक्टरी में एक फोल्डर बनाएं SwiftLibXML2
और इस मॉड्यूल .odulemap को वहां रखें
3. में सेटिंग बिल्ड , जोड़ने $(SDKROOT)/usr/include/libxml2
के लिए हैडर खोजें पथ
4. में सेटिंग बिल्ड , जोड़ने $(SRCROOT)/SwiftLibXML2
के लिए आयात पथ
5. के तहत परियोजना के जनरल टैब, जोड़ने libxml2.tbd
के लिए लिंक्ड फ़्रेमवर्क और पुस्तकालय ।
अब आप इस मॉड्यूल को आयात करते हैं, जहाँ इसकी आवश्यकता होती है:
import SwiftLibXML2
(यदि आप एक अधिक संपूर्ण मॉड्यूल देखना चाहते हैं। उदाहरण के लिए, मैं सुझाव दूंगा कि डार्विन के मॉड्यूल.मॉड्यूलमैप को संदर्भित /usr/include/module.modulemap
करने के लिए, आपको वहां जाने के लिए Xcode कमांड-लाइन टूल स्थापित करने की आवश्यकता होगी, संदर्भ मिसिंग / usr / OS OS X Capitan में शामिल होगा। )