gpt4 book ai didi

ios - NSCoding 在 Swift 的继承类中需要初始值设定项

转载 作者:可可西里 更新时间:2023-10-31 23:44:29 26 4
gpt4 key购买 nike

我有符合 NSObjectNSCoding 的类 Foo 我希望能够与 NSKeyedArchiver 保持一致 我想创建类 Bar , Foo 的子类,也将符合 NSObjectNSCoding。我在理解如何在子类中创建 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com