2015-10-08 7 views
8

मेरे पास एक मिश्रित स्विफ्ट और उद्देश्य-सी प्रोजेक्ट है। उद्देश्य-सी में एक स्विफ्ट सार्वजनिक एपीआई तक पहुंचने के लिए, एपीआई उपभोक्ता को वर्तमान में "MyModule-Swift.h" आयात करना है। मेरे पास पहले से ही "MyModule.h" नामक एक उद्देश्य-सी छतरी हैडर है। लेकिन, "MyModule.h" आयात करना स्विफ्ट एपीआई के लिए काम नहीं करेगा। मैंने छतरी शीर्षलेख में "MyModule-Swift.h" आयात करने का प्रयास किया, लेकिन यह नहीं मिला (मुझे लगता है कि यह एक्सकोड द्वारा फ्लाई पर उत्पन्न होता है)।छतरी शीर्षलेख में -Swift.h शामिल करें

स्विफ्ट/उद्देश्य-सी में लिखे गए सार्वजनिक एपीआई का उपयोग करने के लिए एक एपीआई उपभोक्ता हमेशा "MyModule.h" आयात कर सकता है, तो वास्तव में सराहना की जाएगी।

============================================== ======================

संपादित करें: मैं प्रश्न को ठीक से फ्रेम करने के लिए समय नहीं लेने के लिए क्षमा चाहता हूं। मेरे पास MyModule नामक एक ढांचा है।

मैं एक ऑब्जेक्टिव-सी वर्ग,

@interface ABUser: NSObject 

- (void)walk; 

@end 

मैं इस वर्ग स्विफ्ट का उपयोग करने के नए व्यवहार जोड़ना चाहते थे, इसलिए मैं एक विस्तार

extension ABUser { 

func swiftWalk() 

} 

अब परिभाषित, कहते हैं कि मैं चाहता था ABUser कहा जाता है एक उद्देश्य-सी ऐप से ABUser पर परिभाषित swiftWalk विधि तक पहुंचने के लिए, मुझे #import <MyModule/MyModule-Swift.h> करना होगा। #import <MyModule/MyModule.h> काम करेगा अगर मैं walk विधि का उपयोग करना चाहता था। यह छतरी हैडर MyModule.h आयात ABUser.h मान रहा है।

मैं हमेशा उद्देश्य-सी ऐप को #import <MyModule/MyModule.h> पर चाहता था और इस बारे में चिंता करने की ज़रूरत नहीं है कि क्या एपीआई उद्देश्य-सी या ढांचे में स्विफ्ट में लिखा गया था या नहीं। इसलिए, मैंने छतरी शीर्षलेख MyModule.h में MyModule-Swift.h आयात करने का प्रयास किया। लेकिन, मेरा उद्देश्य-सी ऐप संकलित नहीं हुआ अगर ऐसा करता है। निश्चित नहीं है, अगर ऐसा इसलिए है क्योंकि बिल्ड प्रक्रिया के दौरान फ्लाई पर एक्सकोड द्वारा MyModule-Swift.h उत्पन्न होता है।

संपादित 2: एक नमूना परियोजना यहाँ इस समस्या को ठीक करने जोड़ा गया: https://github.com/priteshshah1983/MyObjectiveCApp

प्रासंगिक कोड ViewController.m में है। बिल्ड master शाखा के साथ असफल हो जाएगा। इसे काम करने के लिए, working शाखा चेकआउट करें।

उत्तर

-1

ऐसा लगता है कि का उपयोग कर #import <MyModule/Module.h> के बजाय @import MyModule; का उपयोग कर walk और swiftWalk तरीकों की अनुमति देता है ऑब्जेक्टिव-सी ऐप्लिकेशन से अपेक्षा के अनुरूप।

मैं ईमानदारी से विवरण नहीं समझता, लेकिन मुझे उम्मीद है कि यह किसी और की मदद करेगा। कृपया समझाने के लिए स्वतंत्र महसूस करें!

+0

"कृपया समझाने में संकोच न करें" मेरी प्रेरणा क्या है? आपने स्वयं को सही उत्तर दिया है, इसलिए बक्षीस अवांछनीय है। आपने कुछ भी नहीं के लिए 50 अंक फेंक दिए हैं ... और सवाल अभी भी काफी सड़ा हुआ है। क्या है "लेकिन, यह काम नहीं किया" _mean_ भी? – matt

+0

ठीक है, मैंने अपने उत्तर को सही उत्तर के रूप में वापस ले लिया। क्षमा करें, मुझे नहीं लगता कि मैं इसे इससे बेहतर समझा सकता हूं। मैंने देखा कि आप पहले से ही मुझे इसके लिए वोट दिया है! – pshah

+0

समस्या को समझने और पुन: उत्पन्न करने के लिए किसी व्यक्ति के लिए आवश्यक सभी वास्तविक कोड क्या नहीं दिखा सकते हैं? – matt

2

@import MyModule; का उपयोग करने का कारण यह है कि "मॉड्यूल फ्रेमवर्क निष्पादन योग्य और इसके शीर्षलेखों के साथ एक पैकेजिंग हैं" (from this SO post)।

दूसरे शब्दों में, जब आप @import MyModule;, ऑब्जेक्टिव-सी स्वचालित रूप से मॉड्यूल से संबंधित सभी त्वरित और उद्देश्य-सी शीर्षलेख आयात करता है, जबकि आप छतरी शीर्षलेख से स्विफ्ट हेडर शामिल नहीं कर सकते हैं। मेरा सुझाव है कि आप लिंक किए गए SO उत्तर में @import और #import के बीच अंतरों पर नज़र डालें।

संबंधित मुद्दे