透過 NSKeyedArchiver 儲存 Struct 物件


To encode and to decode an object with NSKeyedArchiver and NSKeyedUnarchiver, the class must conforms NSCoding but that is what Swift struct s can't do.


In order to achive this, we have to use PropertyListEncoder to encode instances of Swift struct s then passing the output to NSKeyedArchiver.

struct has to conforms to Encodable to able to be encoded by PropertyListEncoder.


To unarchive, decoding data object from NSKeyedUnarchiver, then decoding back to struct objects with PropertyListDecoder.

struct has to conforms to Decodable to able to be decoded by PropertyListDecoder.


Codable Struct

So the struct should conforms to Codable, which is a Decodable & Encodable combination. Encodable is for encoding, Decodable is for decoding.

struct Book: Codable {
    let title: String

NSKeyedArchiver - Encode

let book = Book(title: "Harry Potter")
if let encoded = try? PropertyListEncoder().encode(book) {
    let archiver = NSKeyedArchiver(requiringSecureCoding: false)

    // Encode with a key
    archiver.encode(encoded, forKey: "model")

    // End encoding stream

    // Export the encoded data and store it to somewhere
    // For example a `var data: Data?`
    self.data = archiver.encodedData

NSKeyedUnarchiver - Decode

if let data = data,
   let unarchiver = try? NSKeyedUnarchiver(forReadingFrom: data) {
    if let data = unarchiver.decodeObject(of: NSData.self, forKey: "model") as? Data,
       let book = try? PropertyListDecoder().decode(Book.self, from: data) {