如何在 NSUserDefaults 中存储自定义对象?


在本文中,我们将学习如何在应用程序中存储自定义对象,但在学习如何存储自定义对象之前,让我们先看看什么是自定义对象?

自定义对象是任何类、结构或任何其他不是原生数据类型(如 Int、Double、String 等)的数据。在 NSUserDefaults 中存储数据是一个三步过程。

创建自定义对象

我们将创建一个名为 Person 的自定义类,它将具有 age 变量和 name 变量。

class Person: NSObject, NSCoding {
   var name: String
   var age: Int
   init(name: String, age: Int) {
      self.name = name
      self.age = age
   }
   required convenience init(coder aCoder: NSCoder) {
      let name = aCoder.decodeObject(forKey: "name") as! String
      let age = aCoder.decodeInteger(forKey: "age")
      self.init(name: name, age: age)
   }
   func encode(with acoder: NSCoder) {
      acoder.encode(age,forKey: "age")
      acoder.encode(name,forKey: "name")
   }
}

编码自定义对象

在此步骤中,我们将创建一个 Person 对象数组,将其命名为 people 并使用随机数据对其进行初始化。创建该对象后,我们将使用 NSKeyedArchiver 对其进行归档,然后存储在 userDefaults 中。

let people = [
   Person.init(name: "P1", age: 1),
   Person.init(name: "P2", age: 2),
   Person.init(name: "P3", age: 3),
]
let encoded = NSKeyedArchiver.archivedData(withRootObject: people)
UserDefaults.standard.set(encoded, forKey: "encodedData")

现在我们已成功将归档的对象保存到核心数据中,现在是时候对其进行解档并打印该对象了。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

解码自定义对象

与 NSKeyedArchiver 类似,我们有 NSKeyedUnarchiver,我们将使用它来解档此对象。

let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data
let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]

现在这个“decodedPeople”对象包含我们在第二步中创建的对象。

我们可以对该对象执行所需的操作。现在让我们看看 ViewController 文件是什么样子的;

import UIKit
class ViewController: UIViewController {
   override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
      let people = [
         Person.init(name: "P1", age: 1),
         Person.init(name: "P2", age: 2),
         Person.init(name: "P3", age: 3),
      ]
      let encoded = NSKeyedArchiver.archivedData(withRootObject: people)
      UserDefaults.standard.set(encoded, forKey: "encodedData")
      print("data decoded, encoding now")
      let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data
      let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]
      print(decodedPeople)
   }
}

现在在最后一个打印语句上设置断点并运行此代码,执行时运行此命令

po decodedPeople.first?.name

这将导致

Optional<String>
- some : "P1"

最终是这样的。

更新于: 2020-06-27

536 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告