บทความนี้สอนวิธีเก็บ custom objects (ออบเจกต์ที่สร้างเอง ไม่ใช่ชนิดข้อมูลพื้นฐาน như Int, Double, String) ลงใน NSUserDefaults (ปัจจุบันใช้ UserDefaults) กระบวนการมี 3 ขั้นตอน: สร้าง object, เข้ารหัส (encode), และถอดรหัส (decode)
1. สร้าง Custom Object
สร้างคลาส Person ที่ conform NSCoding:
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")
}
}
2. เข้ารหัส (Encode) และบันทึก
let people = [
Person(name: "P1", age: 1),
Person(name: "P2", age: 2),
Person(name: "P3", age: 3),
]
let encoded = NSKeyedArchiver.archivedData(withRootObject: people)
UserDefaults.standard.set(encoded, forKey: "encodedData")
3. ถอดรหัส (Decode) และอ่านคืน
let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data
let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]
ตัวอย่างเต็มใน ViewController
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let people = [
Person(name: "P1", age: 1),
Person(name: "P2", age: 2),
Person(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)
}
}
การทดสอบ
ตั้ง breakpoint ที่บรรทัดสุดท้าย รัน แล้วใน console พิมพ์:
po decodedPeople.first?.name
ผลลัพธ์: Optional