ในบทความนี้ เราจะเรียนรู้วิธีจัดเก็บวัตถุที่กำหนดเองในแอปพลิเคชันของเรา แต่ก่อนที่คุณจะเรียนรู้วิธีจัดเก็บวัตถุที่กำหนดเอง เรามาดูกันว่าวัตถุที่กำหนดเองคืออะไร
วัตถุที่กำหนดเองคือคลาสหรือโครงสร้างใดๆ หรือข้อมูลอื่นใดที่ไม่ใช่ประเภทข้อมูลดั้งเดิม เช่น 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"
นี่คือลักษณะที่ปรากฏในที่สุด