【问题标题】:NSCoder crash on decodeBool forKey (Xcode 8, Swift 3)decodeBool forKey (Xcode 8, Swift 3) 上的 NSCoder 崩溃
【发布时间】:2016-12-27 12:00:58
【问题描述】:

我有这个简单的课程

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 完成工作时。我不明白问题出在哪里。

谢谢!

【问题讨论】:

    标签: xcode boolean nskeyedarchiver nskeyedunarchiver


    【解决方案1】:

    诀窍是删除!形成原始类型。 如果你放!您说的是“使隐式解包可选”,因此编码器将存档为 NSNumber 而不是 Bool (或 Int、Double)。 如果你删除!编码器将归档为 Bool 并且事情按预期工作(我花了一个“事件”,这个解决方案由 Apple 提供)

    【讨论】:

    【解决方案2】:

    BoolInt 有新方法:

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

    【讨论】:

    • 最后一行可以简单写成:self.z = decoder.decodeBool(forKey: "KeyName"),因为decodeBool已经返回了Bool
    【解决方案3】:

    我遇到了同样的问题。 试试这个:

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

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多