decodeBool forKey (Xcode 8, Swift 3) 上的 NSCoder 崩溃
Posted
技术标签:
【中文标题】decodeBool forKey (Xcode 8, Swift 3) 上的 NSCoder 崩溃【英文标题】:NSCoder crash on decodeBool forKey (Xcode 8, Swift 3) 【发布时间】: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 完成工作时。我不明白问题出在哪里。
谢谢!
【问题讨论】:
【参考方案1】:诀窍是删除!形成原始类型。 如果你放!您说的是“使隐式解包可选”,因此编码器将存档为 NSNumber 而不是 Bool (或 Int、Double)。 如果你删除!编码器将归档为 Bool 并且事情按预期工作(我花了一个“事件”,这个解决方案由 Apple 提供)
【讨论】:
上面我看不懂,我从这个答案中得到了解决方案:***.com/a/39656687/1298362【参考方案2】:Bool
和 Int
有新方法:
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")
【讨论】:
以上是关于decodeBool forKey (Xcode 8, Swift 3) 上的 NSCoder 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
NSKeyedArchiver 在 Swift 3 (Xcode 8) 中不起作用
CKRecord setValue:forKey 或 setObject:forKey
NSMutableArray 的 setValue:forKey: 和 setObject:forKey: 有啥区别?
自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:
iphone:setObject:forKey:和setValue:forKey:在将条目添加到可变字典中的区别是啥[重复]