Я хочу иметь две версии 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 анализируя сначала флаг и декодируя остальные поля на основе его значения.

Другие вопросы по тегам