2014-10-12 16 views
53

nềnLàm cách nào để mã hóa enum bằng NSCoder nhanh chóng?

Tôi cố gắng để mã hóa một enum String-phong cách sử dụng giao thức NSCoding, nhưng tôi chạy vào lỗi chuyển đến và đi trở lại từ String.

tôi nhận được lỗi sau khi giải mã và mã hóa:

String là không mui trần to Stage

tắm luận forKey: trong cuộc gọi

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 
     } 

    // ... 

    } 

Trả lời

57

Bạn cần chuyển đổi enum thành và từ giá trị thô. Trong Swift 1.2 (Xcode 6.3), điều này sẽ trông như thế này:

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), sử dụng as thay vì as!:

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

Swift 1.0 (Xcode 6.0) sử dụng toRaw()fromRaw() như thế này:

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

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

Nếu bạn có! thì chuỗi không bao giờ có thể là nil và '?? .DisplayAll' là vô ích. Nó không phải là 'như?' Thay vào đó? – Oren

+2

'as!' Đang truyền 'Chuỗi' tồn tại để dàn diễn viên thành công. 'Stage (rawValue:" someString ")' trả về một tùy chọn bởi vì chuỗi có thể không xác định một giá trị enum hợp lệ. Bạn phải gỡ bỏ tùy chọn đó. Toán tử * nil coalescing * thay thế tùy chọn đó bằng phiên bản chưa được mở nếu nó tồn tại hoặc '.DisplayAll' nếu không. – vacawama

9

cập nhật cho Xcode 6.3, Swift 1.2:

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

lưu ý as!

Các vấn đề liên quan