2014-10-12 5 views
53

पृष्ठभूमिमैं एनएससीओडर का उपयोग करके एनम को एनकोड कैसे कर सकता हूं?

मैं NSCoding प्रोटोकॉल का उपयोग कर एक स्ट्रिंग शैली enum एन्कोड करने के लिए कोशिश कर रहा हूँ, लेकिन मैं करने के लिए परिवर्तित करने त्रुटियों में चल रहा हूँ और वापस स्ट्रिंग से।

मैं निम्नलिखित त्रुटियाँ मिलता है जबकि डिकोडिंग और एन्कोडिंग: कॉल

कोड

enum Stage : String 
    { 
     case DisplayAll = "Display All" 
     case HideQuarter = "Hide Quarter" 
     case HideHalf  = "Hide Half" 
     case HideTwoThirds = "Hide Two Thirds" 
     case HideAll  = "Hide All" 
    } 

    class AppState : NSCoding, NSObject 
    { 
     var idx = 0 
     var stage = Stage.DisplayAll 

     override init() {} 

     required init(coder aDecoder: NSCoder) { 
      self.idx = aDecoder.decodeIntegerForKey("idx" ) 
      self.stage = aDecoder.decodeObjectForKey( "stage") as String // ERROR 
     } 

     func encodeWithCoder(aCoder: NSCoder) { 
      aCoder.encodeInteger(self.idx,    forKey:"idx" ) 
      aCoder.encodeObject( self.stage as String, forKey:"stage") // ERROR 
     } 

    // ... 

    } 
में:

स्ट्रिंग

अतिरिक्त तर्क ForKey चरण के लिए परिवर्तनीय नहीं है

उत्तर

57

आपको कच्चे मूल्य से और उसके लिए enum को बदलने की जरूरत है। स्विफ्ट 1.2 (Xcode 6.3) में, यह इस तरह दिखेगा:

class AppState : NSObject, NSCoding 
{ 
    var idx = 0 
    var stage = Stage.DisplayAll 

    override init() {} 

    required init(coder aDecoder: NSCoder) { 
     self.idx = aDecoder.decodeIntegerForKey("idx") 
     self.stage = Stage(rawValue: (aDecoder.decodeObjectForKey("stage") as! String)) ?? .DisplayAll 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeInteger(self.idx, forKey:"idx") 
     aCoder.encodeObject( self.stage.rawValue, forKey:"stage") 
    } 

    // ... 

} 

स्विफ्ट 1.1 (Xcode 6.1), का उपयोग करता है asas! के बजाय:

self.stage = Stage(rawValue: (aDecoder.decodeObjectForKey("stage") as String)) ?? .DisplayAll 

स्विफ्ट 1.0 (Xcode 6.0) का उपयोग करता है toRaw() और fromRaw() इस तरह: Xcode 6.3, स्विफ्ट 1.2 के लिए

self.stage = Stage.fromRaw(aDecoder.decodeObjectForKey("stage") as String) ?? .DisplayAll 

    aCoder.encodeObject(self.stage.toRaw(), forKey:"stage") 
+0

आप के रूप में है, तो! तो स्ट्रिंग कभी शून्य नहीं हो सकता है और '?? डिस्प्लेअल 'बेकार है। इसके बजाय यह 'as? 'नहीं होना चाहिए? – Oren

+2

'as!' 'स्ट्रिंग 'कास्टिंग कर रहा है जो मौजूद है इसलिए कलाकार सफल होगा। 'चरण (rawValue:" someString ") 'एक वैकल्पिक देता है क्योंकि स्ट्रिंग मान्य एनम मान को परिभाषित नहीं कर सकती है। आपको उस वैकल्पिक को खोलना होगा। * शून्य कॉल्सिंग ऑपरेटर * उस वैकल्पिक को अनचाहे संस्करण के साथ बदल देता है यदि यह मौजूद है या 'डिस्प्लेअल' अगर ऐसा नहीं होता है। – vacawama

9

अद्यतन:

self.stage = Stage(rawValue: aDecoder.decodeObjectForKey("stage") as! String) ?? .DisplayAll 

टिप्पणी as!

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

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