我们知道 UserDefault 可以存储一些常见的基础数据类型,Int String Date 等等,但当你想存储一些自定义的一些数据 (如 People Car)的时候该怎么办呢。
如下,UserDefaults 在存储自定义数据时,需要:
在自定义类中实现 NSCoding
的两个方法,
- 解密
init(coder aCoder: NSCoder)
- 加密
encode(with aCoder: NSCoder)
用里面的方法来处理自己类的变量
- 解密
aCoder.decodeObject/.decodeInteger/...(forKey: "KEY")
- 加密
aCoder.encode(VAR, forKey: "KEY")
required init?(coder aDecoder: NSCoder) {
super.init()
if let reds = aDecoder.decodeObject(forKey: "redBalls") as? [Int] {
redBalls = reds
} else {
redBalls = []
}
blueBall = aDecoder.decodeInteger(forKey: "blueBall")
}
func encode(with aCoder: NSCoder) {
aCoder.encode(redBalls, forKey:"redBalls")
aCoder.encode(blueBall, forKey: "blueBall")
}
先将数据用 NSKeyedArchiver
转换一下,再存储
let archivedData = NSKeyedArchiver.archivedData(withRootObject: DataVAR) // 先把在存储的变量归档
UserDefaults.standard.set(archivedData, forKey: "KEY") // 再存入 UserDefaults
取出的时候 NSKeyedUnArchiver
if let rawData = (UserDefaults.standard.object(forKey: "KEY") as? Data) {
原始数据 = NSKeyedUnarchiver.unarchiveObject(with: rawData) as! 存入的数据类型
}