2016-08-20 55 views
2

我有這個簡單的類NSCoder碰撞(Xcode中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

訣竅是刪除!形成原始類型。 如果你把!你在說「做一個隱含的解包可選」,所以編碼器將歸檔爲NSNumber而不是Bool(或Int,Double)。 如果你刪除!編碼器將歸檔的布爾和東西按預期工作(我用了一個「事件」,該溶液是由蘋果提供)

+0

我無法上面明白,我從這個答案得到了解決方案: 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"))