5

私はこの単純なクラスを持っています

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 がその仕事をしているときに発生します。問題がどこから来るのか理解できません。

ありがとう!

4

3 に答える 3

14

トリックは削除です!プリミティブ型を形成します。入れたら!「暗黙的にアンラップされたオプションを作成する」と言っているので、エンコーダーは Bool (または Int、Double) ではなく NSNumber としてアーカイブされます。外すと!エンコーダーは Bool としてアーカイブされ、物事は期待どおりに機能します (私は「インシデント」を過ごしましたが、このソリューションは Apple によって提供されます)

于 2016-09-21T17:24:25.250 に答える