【发布时间】:2015-10-30 22:03:17
【问题描述】:
我有符合 NSObject 和 NSCoding 的类 Foo 我希望能够坚持使用 NSKeyedArchiver 我想创建类 Bar,它是 Foo 的子类,它也将符合 NSObject 和 @ 987654325@。我在理解如何在子类中创建 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(...) 重用超级使这个干燥。我遇到的问题是创建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.init(coder: aDecoder)
标签: ios swift cocoa-touch