2017-02-28 7 views
6

दो स्विफ्ट enums पर विचार करें:एक शुद्ध स्विफ्ट एनम की तुलना में @objc enum का अलग विवरण क्यों है?

enum Foo: Int { 
    case bar 
} 

@objc enum Baz: Int { 
    case qux 
} 

अगर मैं print प्रत्येक इन enums के case के लिए गए थे, मैं एक ही परिणाम उम्मीद करेंगे। इसके बजाय, मैं कुछ अप्रत्याशित देखें:

print(Foo.bar) // "bar\n" 
print(Baz.qux) // "Baz\n" 

क्यों एक @objc enum का मामला मुद्रण enum नाम मुद्रित, एक शुद्ध स्विफ्ट enum की case प्रिंट करते समय वास्तविक case नाम मुद्रित करता है? @objc जोड़ना enum के डीबग विवरण को बदलता है?

+5

स्विफ्ट एनम्स ओबीजेसी की तुलना में अधिक मेटाडेटा (केस लेबल्स) लेते हैं। ओबीजेसी enums सिर्फ int की एक श्रृंखला है, जिसके साथ वे केस लेबल का कोई वास्तविक ज्ञान नहीं है। आप enum पर स्विच करके और विभिन्न तारों को लौटकर इसे प्राप्त कर सकते हैं: http://stackoverflow.com/a/14651888/3141234 – Alexander

+0

@Alexander आपको बहुत धन्यवाद! यह अंत में मुझे कुछ तरह का अर्थ बनाता है। मैंने सोचा कि मैं पागल हो रहा था क्योंकि मैंने देखा है कि सभी पदों ने सुझाव दिया है कि स्विफ्ट में एक enum प्रिंटिंग मामले को दिखाएगा, भले ही मैं स्पष्ट रूप से इस मामले का उदाहरण देख रहा था कि यह मामला नहीं है (CBCentralManagerState)। धन्यवाद! – vegather

उत्तर

0

ऐसा इसलिए है क्योंकि @objc enums "सी-संगत enums" हैं, जो जानबूझकर उनके मामलों के बारे में किसी भी प्रतिबिंब जानकारी को उत्सर्जित नहीं करते हैं।

के बाद से स्विफ्ट खुला स्रोत है, हम चारों ओर नाक इस खुद के लिए देखने के लिए कर सकते हैं:

"क्यों", में से एक संस्करण है कि कार्यान्वयन केंद्रित। अब, चलिए एक स्तर पर कदम उठाएं और पूछें, इस तरह इसे क्यों लागू किया गया था? सी-संगत enums के लिए emitCaseNames फ़ंक्शन द्वारा टिप्पणी यह ​​बताती है: सी-संगत enums एनम कच्चे मूल्य से टैग पर वापस मैपिंग की गारंटी नहीं देता है, क्योंकि स्विफ्ट-मूल enums के विपरीत, वे कई मामलों में हो सकता है कि सभी का एक ही कच्चा मूल्य है।

अब, यदि आप स्विफ्ट में एक enum घोषित करने का प्रयास करते हैं जो कच्चे मानों को डुप्लिकेट करता है, तो आपको अपना हाथ थप्पड़ और एक कंपाइलर त्रुटि मिल जाएगी। लेकिन आप ओबज/सी में enum घोषित करके और फिर पुल पर स्विफ्ट में आयात करके इस तरह के एक enum बनाने में सक्षम होना चाहिए।

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