我想在同一个 class 中有两个版本的 encodeWithCoder
I want to have two versions of encodeWithCoder in the same class
假设我有一个对象 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 中实现多个存档方法的最佳方式是什么,以限制写入存档的字段?
与其尝试使用它的 2 个版本,不如弄清楚是什么决定了您要使用的编码,并将其设为单独的 flag/field 并对其进行编码。
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
中做同样的事情,首先解析标志并根据其值解码其余字段。
假设我有一个对象 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 中实现多个存档方法的最佳方式是什么,以限制写入存档的字段?
与其尝试使用它的 2 个版本,不如弄清楚是什么决定了您要使用的编码,并将其设为单独的 flag/field 并对其进行编码。
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
中做同样的事情,首先解析标志并根据其值解码其余字段。