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

标签 ios swift cocoa-touch

我有符合 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/

相关文章:

ios - 删除 Storyboard 中的约束使其变灰(禁用)-我想删除它

swift - 调用可以抛出,但不能抛出全局变量初始值设定项之外的错误

ios - 在更新功能中开始倒计时

iphone - 有没有一种安全的方法可以手动为 UIScrollView 的滚动设置动画?

ios - NSMakeRange(i, 1) 是什么意思?

ios - Swift - 检测在 UISearchBar 上输入的文本

ios - 将 UICollectionViewCell 放入 UICollectionView

ios - PFLogInViewController logInView.usernameField.attributedPlaceholder 不见了

ios - 如何创建附件图像中的颜色组合?

objective-c - 设置无处不在 :itemAtURL:destinationURL:error: does not remove the item from iCloud