我有符合 NSObject
和 NSCoding
的类 Foo 我希望能够与 NSKeyedArchiver
保持一致 我想创建类 Bar , Foo 的子类,也将符合 NSObject
和 NSCoding
。我在理解如何在子类中创建 required convenience init?(coder aDecoder: NSCoder)
时遇到问题。
所以类 Foo...
class Foo: NSObject, NSCoding {
let identifier:String
init(identifier:String) {
self.identifier = identifier
}
override var description:String {
return "Foo: \(identifier)"
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(identifier, forKey: "identifier")
}
required convenience init?(coder aDecoder: NSCoder) {
guard let identifier = aDecoder.decodeObjectForKey("identifier") as? String
else {
return nil
}
self.init(identifier:identifier)
}
}
然后类 Bar ...
class Bar:Foo {
let tag:String
init(identifier:String, tag:String) {
self.tag = tag
super.init(identifier: identifier)
}
override var description:String {
return "Bar: \(identifier) is \(tag)"
}
}
我可以通过添加以下方法来编译它,使它符合 NSCoding
override func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(tag, forKey: "tag")
super.encodeWithCoder(aCoder)
}
这是有道理的,因为我调用 super.encodeWithCoder(...)
重用 super 使它变干。我遇到的问题是创建 required convenience init?(...)
我似乎可以让它编译的唯一方法是这样做...
required convenience init?(coder aDecoder:NSCoder) {
guard let identifier = aDecoder.decodeObjectForKey("identifier") as? String,
let tag = aDecoder.decodeObjectForKey("tag") as? String
else {
return nil
}
self.init(identifier:identifier, tag:tag)
}
我基本上已经复制了父类(super class)所需的初始化程序,然后为子类属性添加了额外的解码方法。这种做法好像不太对……
有没有更好的方法来实现这个?
最佳答案
在解码并分配所需 init 方法中的所有子类属性后,立即调用:
super.init(coder: aDecoder)
关于ios - NSCoding 在 Swift 的继承类中需要初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33445556/