【问题标题】:I want to have two versions of encodeWithCoder in the same class我想在同一个类中有两个版本的 encodeWithCoder
【发布时间】:2015-05-12 23:14:07
【问题描述】:

假设我有一个对象 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 中实现多个归档方法的最佳方法是什么,以限制写入归档的字段?

【问题讨论】:

    标签: ios swift nscoding nscoder


    【解决方案1】:

    与其尝试拥有 2 个版本,不如弄清楚是什么决定了您要使用哪种编码,并将其设为单独的标志/字段并对其进行编码。

    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 中执行相同的操作,首先解析标志并根据其值解码其余字段。

    【讨论】:

    • 这是有道理的。允许我创建数据的私有副本,然后对该副本进行编码。刚刚实施并完美运行。谢谢!
    猜你喜欢
    • 2023-04-04
    • 2022-01-13
    • 2020-07-10
    • 2023-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多