स्विफ्ट - एन्ट इन एनम: इंट


134

मैं स्विफ्ट के लिए बहुत नया हूं (इस सप्ताह शुरू हुआ) और मैं अपने ऐप को ऑब्जेक्टिव-सी से माइग्रेट कर रहा हूं। मेरे पास मूल रूप से ऑब्जेक्टिव-सी में निम्न कोड है जो ठीक काम करता है:

typedef enum : int {
    MyTimeFilter1Hour = 1,
    MyTimeFilter1Day = 2,
    MyTimeFilter7Day = 3,
    MyTimeFilter1Month = 4,
} MyTimeFilter;

...

- (void)selectFilter:(id)sender
{
    self.timeFilterSelected = (MyTimeFilter)((UIButton *)sender).tag;
    [self closeAnimated:YES];
}

स्विफ्ट में इसका अनुवाद करते समय, मैंने निम्नलिखित कार्य किया:

enum MyTimeFilter : Int {
    case OneHour = 1
    case OneDay = 2
    case SevenDays = 3
    case OneMonth = 4
}

...

@IBAction func selectFilter(sender: AnyObject) {
    self.timeFilterSelected = (sender as UIButton).tag as MyTimeFilter
    self.close(true)
}

ऐसा करने से, मुझे त्रुटि मिलती है:

'Int' 'MyTimeFilter' के लिए परिवर्तनीय नहीं है

मुझे नहीं पता कि मेरा दृष्टिकोण (टैग संपत्ति का उपयोग करना) सबसे अच्छा है, लेकिन वैसे भी मुझे इस तरह की कास्टिंग अपने ऐप में विभिन्न स्थानों पर करने की आवश्यकता है। क्या किसी को इस बात का अंदाजा है कि इस त्रुटि से कैसे छुटकारा पाया जाए?

धन्यवाद!


2
यह भी ध्यान दें कि इसके बजाय (sender as UIButton), आप UIButtonइसके बजाय लेने के लिए विधि हस्ताक्षर को बदल सकते हैं AnyObject
बेन लेगियरियो

जवाबों:


240

rawValueइनिशियलाइज़र का उपयोग करें : यह एक इनिशियलाइज़र है जो स्वचालित रूप से enums के लिए उत्पन्न होता है ।

self.timeFilterSelected = MyTimeFilter(rawValue: (sender as UIButton).tag)!

देखें: स्विफ्ट प्रोग्रामिंग भाषा The गणना


नोट: यह उत्तर बदल गया है। स्विफ्ट के पहले संस्करण fromRaw()कच्चे मानों को संचित मानों में बदलने के लिए वर्ग विधि का उपयोग करते हैं।


यह भी ध्यान दें कि यदि प्रेषक का टैग किसी एनम मूल्य के अनुरूप नहीं है, तो इसके कारण क्रैश हो जाएगा !
बेन लेगियरियो

2
मैं कहता हूँ कि इस मामले में बग को पकड़ने के लिए दुर्घटनाग्रस्त होना सबसे अच्छा तरीका है।
XY

0

स्विफ्ट 5

@IBAction func selectFilter(sender: AnyObject) {
    timeFilterSelected = MyTimeFilter(rawValue: sender.tag)
 }

आपने इस प्रश्न का उत्तर बिल्कुल नहीं दिया, यह टिप्पणी करने के बजाय कि आप नहीं जानते कि किसी ने नीचा क्यों देखा, प्रश्न की जाँच करें और आपके उत्तर ने फिर से क्यों किसी को नीचा दिखाया। फिर भी मुझे इसे भी कम करना होगा।
रेनीटिक

0

जेफरी थॉमस के जवाब पर विस्तार से। सुरक्षित जगह होने के लिए एक गार्ड स्टेटमेंट का उपयोग करने से पहले कलाकारों को अनफ्रैप करें, इससे क्रैश से बचा जा सकेगा

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.