如何在 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")

現在我們已成功將歸檔的物件儲存到核心資料中,現在是時候對其進行解檔並列印該物件了。

解碼自定義物件

與 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 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告