2016-08-20 4 views
2

나는이 간단한 클래스NSCoder 충돌 (엑스 코드 (8), 스위프트 3)

import UIKit 

class SimpleModel: NSObject, NSCoding { 

    var name : String! 
    var done : Bool! 

    init(name:String) { 
     self.name = name 
     self.done = false 
    } 

    internal required init?(coder aDecoder: NSCoder) { 
     self.name = aDecoder.decodeObject(forKey: "name") as! String 
     self.done = aDecoder.decodeBool(forKey: "done") // BUG HERE 
    } 

    func encode(with encoder: NSCoder) { 
     encoder.encode(self.name, forKey: "name") 
     encoder.encode(self.done, forKey: "done") 
    } 
} 

을 가지고있는 코드가 저장 :

let data = NSKeyedArchiver.archivedData(withRootObject: storageArray) 
UserDefaults.standard.set(data, forKey: "storage") 
UserDefaults.standard.synchronize() 

읽기 코드 :

if let data = UserDefaults.standard.data(forKey: "storage") { 
    storageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as! [SimpleModel] 
} 

을 문제는 NSKeyedUnarchiver가 작업을 수행 할 때 발생합니다. 문제가 어디서 왔는지 이해할 수 없습니다.

감사합니다.

답변

7

트릭 제거입니다! 원시적 형을 형성합니다. 넣으면! 인코더가 Bool (또는 Int, Double) 대신 NSNumber로 아카이브 할 수 있도록 "암시 적 - 언 래핑 된 옵션"을 말합니다. 제거하면! 예상대로 BOOL 사물 작품으로 인코더가 보관됩니다

+0

내가 위에서 이해할 수 없었다, I 이 대답에서 해결책을 얻었습니다 : https://stackoverflow.com/a/39656687/1298362 – g212gs

+0

감사합니다. 통찰력있는 대답을 주셔서 감사합니다. 단지 "여기가이 작업을함으로써 ...." – TheFuquan

4

동일한 문제가있었습니다. 이 시도 :

self.done = aDecoder.decodeObject(forKey: "done") as? Bool ?? aDecoder.decodeBool(forKey: "done") 
9

BoolInt이 새로운 방법이 (내가 애플에서 제공하는 "사건"이 솔루션을 보냈다) :

self.x = Int(decoder.decodeCInt(forKey: "Speed")) 
self.y = decoder.decodeObject(forKey: "Serial") as! String 
self.z = Bool(decoder.decodeBool(forKey: "Direction"))