Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

วิธีเก็บ Custom Objects ใน NSUserDefaults (iOS/Swift)

บทความนี้สอนวิธีเก็บ 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 - some : "P1"