2014-10-12 24 views
53

ArkaplanEnum'u NSCoder kullanarak hızlıca nasıl kodlarım?

Ben NSCoding protokolünü kullanarak bir dize tarzı enum kodlamak çalışıyorum ama yapmak dönüştürme hataları içine koşu ve geri String duyuyorum.

Ben aşağıdaki hataları alırken çözme ve kodlama: çağrı

Kod

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 
     } 

    // ... 

    } 
yılında:

Dize

Ekstra argüman ForKey Basamağa dönüştürülebilir değil

cevap

57

Enum'u ham değere ve ham değere dönüştürmeniz gerekir. Swift 1.2 (6.3 Xcode) 'de, bu gibi olacaktır:

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") 
    } 

    // ... 

} 

Swift 1.1 (Xcode 6.1), as yerine as! kullanır:

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

Swift 1.0 (Xcode 6.0) kullanan toRaw() ve böyle fromRaw(): Xcode 6.3, Swift 1.2

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

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

! o zaman String asla sıfır olamaz ve '?? .DisplayAll' işe yaramaz. Bunun yerine? 'Değil mi? – Oren

+2

"As!", Var olan "String" i çevirir, böylece cast başarılı olur. 'Stage (rawValue:" someString ")', isteğe bağlı olarak döndürür, çünkü dize geçerli bir enum değeri tanımlayamaz. O isteğe bağlı istemedin. * Nil birleştirme operatörü *, isteğe bağlı olarak isteğe bağlı olmayan bir sürümle değiştirir ya da yoksa, “.DisplayAll” ile değiştirir. – vacawama

9

güncelle:

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

notunu siz varsa as!

İlgili konular