मैंने इस मुद्दे को निम्नलिखित के साथ अपने सबसे सरल रूप में उबालने की कोशिश की है।
सेट अप
Xcode संस्करण 6.1.1 (6A2008a)
में परिभाषित एक एनम MyEnum.swift
:
internal enum MyEnum: Int {
case Zero = 0, One, Two
}
extension MyEnum {
init?(string: String) {
switch string.lowercaseString {
case "zero": self = .Zero
case "one": self = .One
case "two": self = .Two
default: return nil
}
}
}
और कोड जो किसी अन्य फ़ाइल में enum को इनिशियलाइज़ करता है MyClass.swift
:
internal class MyClass {
let foo = MyEnum(rawValue: 0) // Error
let fooStr = MyEnum(string: "zero")
func testFunc() {
let bar = MyEnum(rawValue: 1) // Error
let barStr = MyEnum(string: "one")
}
}
त्रुटि
MyEnum
अपने कच्चे-मूल्य इनिशियलाइज़र के साथ आरंभ करने का प्रयास करते समय Xcode मुझे निम्न त्रुटि देता है:
Cannot convert the expression's type '(rawValue: IntegerLiteralConvertible)' to type 'MyEnum?'
टिप्पणियाँ
प्रति स्विफ्ट भाषा गाइड :
यदि आप एक कच्चे-प्रकार के प्रकार के साथ एक गणना को परिभाषित करते हैं, तो गणन स्वचालित रूप से एक आरम्भक प्राप्त करता है जो कच्चे मान के प्रकार (जैसा कि एक पैरामीटर कहा जाता है
rawValue
) का मान लेता है और या तो एक गणना सदस्य या देता हैnil
।के लिए कस्टम इनिशियलाइज़र
MyEnum
को यह जांचने के लिए एक विस्तार में परिभाषित किया गया था कि भाषा गाइड से निम्नलिखित मामले के कारण एनम के कच्चे-मूल्य इनिशियलाइज़र को हटाया जा रहा है या नहीं । हालाँकि, यह समान त्रुटि परिणाम प्राप्त करता है।ध्यान दें कि यदि आप मूल्य प्रकार के लिए एक कस्टम इनिशियलाइज़र को परिभाषित करते हैं, तो आपके पास उस प्रकार के लिए अब डिफ़ॉल्ट इनिशियलाइज़र (या सदस्यवार इनिशियलाइज़र, यदि यह एक संरचना है) तक पहुँच नहीं होगी। [...]
यदि आप चाहते हैं कि आपका कस्टम वैल्यू टाइप डिफॉल्ट इनिशियलाइज़र और मेंडवाइज़र इनिशियलाइज़र के साथ तुलनात्मक हो और अपने स्वयं के कस्टम इनिशियलाइज़र के साथ भी, तो आप अपने कस्टम इनिशियलाइज़र को वैल्यू टाइप के मूल कार्यान्वयन के भाग के बजाय एक एक्सटेंशन में लिखें।के
MyClass.swift
लिएbar
नहीं बल्कि त्रुटि को हल करने के लिए एनम परिभाषा को आगे बढ़ानाfoo
।कस्टम इनिशियलाइज़र को हटाने से दोनों त्रुटियां हल हो जाती हैं।
एक समाधान यह है कि एनुम परिभाषा में निम्नलिखित फ़ंक्शन को शामिल करें और इसे प्रदान किए गए कच्चे-मूल्य इनिशियलाइज़र के स्थान पर उपयोग करें। तो ऐसा लगता है जैसे कि कस्टम इनिशियलाइज़र को जोड़ने से रॉ-वैल्यू इनिशियलाइज़र को चिह्नित करने के समान प्रभाव पड़ता है
private
।init?(raw: Int) { self.init(rawValue: raw) }
स्पष्ट रूप से के लिए इनलाइन त्रुटि
RawRepresentable
कोMyClass.swift
हल करने के लिए प्रोटोकॉल अनुरूपता की घोषणा कीbar
, लेकिन डुप्लिकेट प्रतीकों के बारे में एक लिंकर त्रुटि में परिणाम (क्योंकि कच्चे-प्रकार के प्रकार अंतर्निहित रूप से अनुरूप हैंRawRepresentable
)।extension MyEnum: RawRepresentable {}
किसी को भी यहाँ क्या हो रहा है में थोड़ा और अंतर्दृष्टि प्रदान कर सकते हैं? कच्चे-मूल्य इनिशियलाइज़र सुलभ क्यों नहीं है?
internal
गुंजाइश होनी चाहिए (या कम से कम प्रकार से मेल खाना चाहिए ), नहींprivate
।