Bài này học cách lưu đối tượng tùy chỉnh trong ứng dụng, trước tiên xem đối tượng tùy chỉnh là gì?
Đối tượng tùy chỉnh là bất kỳ class, struct hoặc dữ liệu nào không phải kiểu dữ liệu gốc như Int, Double, String. Lưu dữ liệu trong NSUserDefaults là quy trình 3 bước.
Tạo đối tượng tùy chỉnh
Tạo class Person tuân thủ NSObject, NSCoding với biến age và 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") } }
Mã hóa (Encoding) đối tượng tùy chỉnh
Tạo mảng đối tượng Person, gọi là people, khởi tạo dữ liệu ngẫu nhiên. Dùng NSKeyedArchiver lưu trữ (archive) đối tượng này và lưu vào 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")
Đã lưu đối tượng archived vào core data, giờ giải nén (unarchive) và in đối tượng.
Giải mã (Decoding) đối tượng tùy chỉnh
Tương tự NSKeyedArchiver, dùng NSKeyedUnarchiver để giải nén.
let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]
Đối tượng "decodedPeople" chứa đối tượng tạo ở bước 2.
Có thể thực hiện thao tác mong muốn với đối tượng. Xem file ViewController hoàn chỉnh:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() 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) } }
Đặt breakpoint ở print cuối và chạy, thực hiện lệnh:
po decodedPeople.first?.name
Kết quả:
Optional<String> - some : "P1"
Hình ảnh kết quả:
