2015-11-02 9 views
11

क्या उद्देश्य-सी शीर्षलेख से स्विफ्ट एनम का संदर्भ देने का कोई तरीका है? आप ऑब्जेक्टिव-सी शीर्षक में स्विफ्ट वर्गों देखना चाहते हैं तो आपउद्देश्य-सी शीर्षलेख में स्विफ्ट एनम का संदर्भ कैसे लें

@objc class Foo 

का उपयोग मैं enums के लिए इसी तरह कुछ भी नहीं दिख रहा है कर सकते हैं।

उत्तर

17

आप जो करना चाहते हैं उसे forward declaration कहा जाता है। एक enum आप कर सकते हैं की घोषणा अग्रेषित करने के लिए:

enum name; 

लेकिन चूंकि संकलक enum के आकार पता नहीं होगा, आप केवल अपने हेडर फाइल में एक सूचक के रूप में उपयोग करने के लिए सक्षम हो जाएगा। यदि आप -pedantic जैसे कंपाइलर झंडे का उपयोग करते हैं तो यह भी समस्याग्रस्त साबित हो सकता है।

तो संक्षेप में, ऐसा करने का कोई अच्छा तरीका नहीं है। आपकी सबसे अच्छी शर्त नहीं है, और इसके बजाय आपके कार्यान्वयन (.m) फ़ाइल से enum तक पहुंचें।

@interface MyObjCClassDefinedInTheHFile() 
    @property (nonatomic, assign) SomeSwiftEnum type; 
@end 

आशा इस मदद करता है:

अपने कार्यान्वयन फ़ाइल में #import अपने तेज हेडर फाइल को पूरा करने, और अपनी समस्या के बारे में अधिक जानकारी जानने के बिना, आप निजी संपत्तियों है कि इस तरह अपने enum का उपयोग जोड़ सकते हैं।

+4

सहमत हैं कि कोई अच्छा जवाब नहीं है। मैं जिस कोडबेस पर काम कर रहा हूं वह स्विफ्ट और ऑब्जेक्टिव सी के बीच प्रवाह में है, इसलिए मेरा समाधान यहां (कुछ हद तक) उचित ओबीजेसी फ़ाइल में enum घोषित करना था, जब तक कि हम पूरी तरह से स्विफ्ट पर न हों। ब्रिजिंग हेडर फ़ाइल का उपयोग करके, ओबीजेसी के बीच enums साझा करने और उस तरह से तेजी से साझा करना बहुत आसान है। – Elise

+0

बिल्कुल, दुर्भाग्य से यह आपकी सबसे अच्छी शर्त हो सकती है, खासकर अगर enum को आपकी परियोजना के भीतर उस दृश्यता की आवश्यकता हो। – raf

+4

फॉरवर्ड घोषित कार्य: 'टाइपपीफ SWIFT_ENUM (एनएसआईएनटेगर, माईएनम);' – amleszk

-3

आप ऑब्जेक्टिव-सी में स्विफ्ट enums उपयोग कर सकते हैं, लेकिन केवल अगर enum एक @objc क्वालीफायर, जिसका अर्थ है कि यह प्रकार Int का हो गया है के साथ घोषित किया जाता है।

+2

सही और मैंने यह किया है। यह इसे हेडर में उपलब्ध नहीं कराएगा। – Phil

+0

आपके ओब्जे-सी हेडर को '# शामिल करें' -Swift.h "'। क्या आपको इसकी आवश्यकता है? – NRitH

+3

आप ऑब्जेक्टिव-सी हेडर फ़ाइल में -Swift.h फ़ाइल को शामिल नहीं कर सकते हैं। आप इसे केवल कार्यान्वयन फ़ाइल में शामिल कर सकते हैं। – Phil

-1

enums त्वरित उद्देश्य-सी संचार का एक हिस्सा है जो हमेशा काम नहीं करता है। बात यह है कि उद्देश्य-सी में, enums केवल आदिम प्रकार हो सकते हैं (उदाहरण के लिए NSInteger)।

swift में आप अधिक प्रकार के पर enums हो सकता है, उदाहरण के लिए String। स्विफ्ट के बारे में एक अद्भुत चीज में से एक कौन सा है।

हालांकि, इन enums उद्देश्य-सी के लिए संकलित नहीं किया जाएगा क्योंकि उनके लिए कोई समकक्ष नहीं है। इसलिए वे इस हेडर फ़ाइल में अनदेखा और उत्पन्न नहीं होंगे कि xcode आपके सभी त्वरित फ़ाइलों के लिए बनाता है। यह कहा जाता है ऑब्जेक्टिव-सी इंटरफ़ेस हैडर उत्पन्न: enter image description here

यह उत्पन्न फ़ाइल सभी वर्गों और उद्देश्य-सी में उपलब्ध enums में शामिल है। आपको ऑब्जेक्टिव-सी में @objc के साथ जो भी आप दिखाना चाहते हैं उसे चिह्नित करना होगा या उन्हें public बनाएं। यदि आपके पास यह है, तो आपको उनके लिए काम करने के लिए किसी भी आगे की घोषणा की आवश्यकता नहीं है।

आशा है कि इससे आपको पता चल जाएगा कि ओबजेक में आपका enum क्यों दिखाई नहीं दे रहा है। अगर यह काम करता है तो मुझे बताएं।

2

मिश्रित ओबीजेसी में - स्विफ्ट परियोजनाएं दोनों प्रकार के वर्गों में काम करने के लिए सबसे अच्छा तरीका है ओबीजेसी हेडर में एनम को परिभाषित करना होगा, न कि तेजी से कक्षा में। तेज enums ObjC हेडर फाइल जहां तक ​​मेरा बता सकते हैं जवाब से लिया here

-1

में उपयोग नहीं किया जा सकता है, raf's answer अभी भी सही है। सबसे साफ समाधान यह है कि जब तक आपको ऑब्जेक्टिव-सी हेडर से इसे एक्सेस करने की आवश्यकता न हो, तब तक अपने एनम को ऑब्जेक्टिव-सी फ़ाइल में छोड़ दें। हालांकि, मैं एक और संभावित कामकाज पेश करना चाहता था।

मेरे मामले में मैं धीरे-धीरे स्विफ्ट में एक बड़ी उद्देश्य-सी परियोजना को फिर से लिख रहा हूं, और अगर मुझे स्विफ्ट में मेरे अधिक कोड को फिर से लिखने की अनुमति मिलती है तो मुझे अपूर्ण कामकाज नहीं लगता है। तो मैं उद्देश्य-सी के लिए enum को गुजरने के लिए बस गया है क्योंकि यह कच्चे प्रकार, Int, या NSInteger उद्देश्य-सी के लिए है। उदाहरण के लिए:

- (void)doSomethingWithType:(NSInteger)rawType { 
    if (rawType == ExampleTypeWhatever) { 
     // Do something 
    } // etc... 
} 

जब मैं स्विफ्ट से इस विधि कॉल, सब मैं क्या करना है .rawType पारित किया जाता है, वास्तविक enum मान के बजाय:

objcObject.doSomething(withType: ExampleType.whatever.rawValue) 

यह बातें दोनों पक्षों पर काफी सरल रहता है , और doSomethingWithType: को एक बार अपडेट करना आसान हो जाएगा, अंत में स्विफ्ट में फिर से लिखा जाएगा।

-2

मैं केवल NSInteger दोनों शीर्षलेख और कार्यान्वयन फ़ाइलों के लिए वापसी प्रकार के रूप में उपयोग करता हूं। और जब आपको enum का उपयोग करने की आवश्यकता होती है, तो let yourEnum = YourEnum(rawValue: Int(enumNSInteger)) द्वारा enum प्राप्त करें। यह मेरे लिए काम करता है।

5

typedef SWIFT_ENUM(NSInteger, MyEnum);

+0

मेरे लिए पूरी तरह से काम किया। – PashaN

+0

बिल्कुल सही, धन्यवाद! – KPM

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