2014-07-20 10 views
5

मैं इस त्रुटि मिलती है:स्विफ्ट - स्विच बयान में enum का उपयोग कर

enum Cat:Int { 
    case Siamese = 0 
    case Tabby 
    case Fluffy 
} 

let cat = indexPath.row as Cat 
    switch cat { 
    case .Siamese: 
     //do something 
     break; 
    case .Tabby: 
     //do something else 
     break; 
    case .Fluffy: 

     break; 
    } 

मैं इस त्रुटि को कैसे हल कर सकते हैं:

'NSNumber' is not a subtype of Cat 

यहाँ कोड है?

+0

सरल उत्तर है, इस प्रकार के बारे में झूठ बोलने की कोशिश न करें; indexPath.row एक इंट है, बिल्ली नहीं। हालांकि, इसे रोकने मत देना; आप जो कर रहे हैं वह बेहद स्वाभाविक है और आपको इस सड़क पर जाना जारी रखना चाहिए। बहुत अच्छा। – matt

उत्तर

8

गणना प्राप्त करने के लिए Cat.fromRaw(indexPath.row) का उपयोग करें।

क्योंकि fromRaw() की वापसी मान एक वैकल्पिक है, यह इस प्रकार की तरह उपयोग करें:

if let cat = Cat.fromRaw (indexPath.row) { 
    switch cat { 
    // ... 
    } 
} 
3

तरह से मैं हाल ही में एक अनुप्रयोग में स्थिति के इस एक ही तरह से संभाला स्थिर की पूरी तरह से मिलकर एक संरचना का उपयोग किया गया सदस्य, एक एनम के बजाए - कुछ हिस्सों में क्योंकि मेरे पास प्रत्येक विकल्प के साथ सहयोग करने के लिए अधिक जानकारी थी, क्योंकि मुझे toRaw() और fromRaw() हर जगह कॉल करने में बीमार पड़ गया था, और कुछ हद तक क्योंकि (जैसा कि आपके उदाहरण से पता चला है) जब यह पता चला कि आप चक्र के माध्यम से चक्र नहीं ले सकते हैं, या मामलों की पूरी सूची प्राप्त नहीं कर सकते हैं तो एनम इसका लाभ खो देता है।

struct Sizes { 
    static let Easy = "Easy" 
    static let Normal = "Normal" 
    static let Hard = "Hard" 
    static func sizes() -> [String] { 
     return [Easy, Normal, Hard] 
    } 
    static func boardSize (s:String) -> (Int,Int) { 
     let d = [ 
      Easy:(12,7), 
      Normal:(14,8), 
      Hard:(16,9) 
     ] 
     return d[s]! 
    } 
} 

struct Styles { 
    static let Animals = "Animals" 
    static let Snacks = "Snacks" 
    static func styles() -> [String] { 
     return [Animals, Snacks] 
    } 
    static func pieces (s:String) -> (Int,Int) { 
     let d = [ 
      Animals:(11,110), 
      Snacks:(21,210) 
     ] 
     return d[s]! 
    } 
} 

अब मैं इस तरह बात कर सकते हैं जब हम cellForRowAtIndexPath के लिए मिलता है:

तो, क्या मैंने किया था यह था

let section = indexPath.section 
    let row = indexPath.row 
    switch section { 
    case 0: 
     cell.textLabel.text = Sizes.sizes()[row] 
    case 1: 
     cell.textLabel.text = Styles.styles()[row] 
    default: 
     cell.textLabel.text = "" // throwaway 
    } 

अनिवार्य रूप से मैं बस के साथ नामस्थान के रूप में दो Structs का उपयोग किया है कुछ जोड़ा बुद्धिमानी। मैं यह नहीं कह रहा हूं कि आप जो कर रहे हैं उससे बेहतर है; वे दोनों बेहद स्वाधीन हैं। यह विचार करने का एक और विचार है।

+0

कूल। GoZoner तकनीकी रूप से सवाल का जवाब दिया। लेकिन मुझे लगता है कि मैं इस तरह कुछ रिफैक्टरिंग करूँगा इसलिए मुझे तारों को टाइप करना नहीं है। +1 – soleil

+0

आप एक स्थिर कार्य के साथ-साथ जो कुछ भी कर रहे हैं उसके समान, एक स्थिर कार्य के साथ, इनट्स की एक enum की बजाय तारों की कम से कम एक पंख पर विचार करना चाह सकते हैं। – matt

+0

आप कुछ कैसे करते हैं 'चलो स्टाइल = स्टाइल.एनिमल?' मुझे लगता है कि "एनएसएसटींग स्टाइल का सबटाइप नहीं है" – soleil

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