Для реализации encodeWithCoder: вы должны пройти через все основные свойства вашего объекта и использовать различные методы NSCoder для их кодирования. Для свойств объекта просто используйте encodeObject: forKey :. Ключом может быть просто короткая строка, описывающая кодируемое свойство:
class Book: NSObject, NSCoding {
var title: String
var author: String
var pageCount: Int
var categories: [String]
var available: Bool
// Memberwise initializer
init(title: String, author: String, pageCount: Int, categories: [String], available: Bool) {
self.title = title
self.author = author
self.pageCount = pageCount
self.categories = categories
self.available = available
}
// MARK: NSCoding
required convenience init?(coder decoder: NSCoder) {
guard let title = decoder.decodeObjectForKey("title") as? String,
let author = decoder.decodeObjectForKey("author") as? String,
let categories = decoder.decodeObjectForKey("categories") as? [String]
else { return nil }
self.init(
title: title,
author: author,
pageCount: decoder.decodeIntegerForKey("pageCount"),
categories: categories,
available: decoder.decodeBoolForKey("available")
)
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.title, forKey: "title")
coder.encodeObject(self.author, forKey: "author")
coder.encodeInt(Int32(self.pageCount), forKey: "pageCount")
coder.encodeObject(self.categories, forKey: "categories")
coder.encodeBool(self.available, forKey: "available")
}
}
Как видите, NSCoding - это в основном шаблон. Каждое свойство кодируется или декодируется как объект или тип, используя имя свойства в качестве ключа каждый раз. (Некоторые разработчики предпочитают определять константы NSString * для каждого ключевого пути, но это обычно не требуется).