我们知道 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! 存入的数据类型
}