Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> IOS

จะเก็บวัตถุที่กำหนดเองใน NSUserDefaults ได้อย่างไร


ในบทความนี้ เราจะเรียนรู้วิธีจัดเก็บวัตถุที่กำหนดเองในแอปพลิเคชันของเรา แต่ก่อนที่คุณจะเรียนรู้วิธีจัดเก็บวัตถุที่กำหนดเอง เรามาดูกันว่าวัตถุที่กำหนดเองคืออะไร

วัตถุที่กำหนดเองคือคลาสหรือโครงสร้างใดๆ หรือข้อมูลอื่นใดที่ไม่ใช่ประเภทข้อมูลดั้งเดิม เช่น Int, Double, String เป็นต้น การจัดเก็บข้อมูลใน NSUserDefaults เป็นกระบวนการสามขั้นตอน

การสร้างวัตถุที่กำหนดเอง

เราจะสร้างคลาส Person ที่กำหนดเองซึ่งจะมีตัวแปรอายุและชื่อตัวแปร

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")
   }
}

การเข้ารหัสวัตถุที่กำหนดเอง

ในขั้นตอนนี้ เราจะสร้างอาร์เรย์ของวัตถุบุคคล เรียกมันว่าบุคคล และเริ่มต้นมันด้วยข้อมูลแบบสุ่ม เมื่อเราสร้างวัตถุนั้นแล้ว เราจะใช้ 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” นี้มีวัตถุที่เราสร้างขึ้นในขั้นตอนที่ 2

เราสามารถดำเนินการตามที่ต้องการได้ด้วย at object ตอนนี้เรามาดูกันว่าไฟล์ 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"

นี่คือลักษณะที่ปรากฏในที่สุด

จะเก็บวัตถุที่กำหนดเองใน NSUserDefaults ได้อย่างไร