swift - क्यों एक @objc enum एक शुद्ध स्विफ्ट enum से एक अलग विवरण है?



enums (1)

दो स्विफ्ट ऊर्जा विचार करें:

enum Foo: Int {
    case bar
}

@objc enum Baz: Int {
    case qux
}

अगर मैं इन case के प्रत्येक case को print करूँगा, तो मैं उसी परिणाम की अपेक्षा करता हूं। इसके बजाय, मुझे कुछ अप्रत्याशित दिखाई देता है:

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

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


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

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

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

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





enums