Я хочу иметь две версии encodeWithCoder в одном классе
Допустим, у меня есть объект Person. (Я знаю, что у Person есть синтаксические ошибки. Пожалуйста, игнорируйте их.)
class Person: NSObject, NSCoding {
var name : String
var salary: NSNumber
// MARK: NSCoding
required convenience init(coder decoder: NSCoder) {
self.init()
self.name = decoder.decodeObjectForKey("name") as String
self.salary = decoder.decodeObjectForKey("salary") as NSNumber
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeObject(self.salary, forKey: "salary")
}
}
Мой вопрос: возможно ли иметь два отдельных метода encodeWithCoder.. один, который включает в себя зарплату в заархивированном объекте, а другой - нет. Что-то вроде:
func encodeWithCoderPrivate(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeObject(self.salary, forKey: "salary")
}
func encodeWithCoderPublic(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
}
Как лучше всего реализовать несколько методов архивирования в NSObject, как способ ограничения полей, записываемых в архив?
1 ответ
Решение
Вместо того, чтобы пытаться получить две его версии, вы должны выяснить, что именно определяет, какую кодировку вы хотите использовать, и сделать это отдельным флагом / полем, а также кодировать его.
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
if self.someFlag == true {
coder.encodeObject(self.salary, forKey: "salary")
}
// encode flag as well
}
Тогда вы можете сделать то же самое в initWithCoder
анализируя сначала флаг и декодируя остальные поля на основе его значения.