'self' used before self.init call error while using NSCoding on a custom class

'self' used before self.init call error while using NSCoding on a custom class

我正在尝试对自定义 class 进行编码,以便我可以使用 NSKeyedArchiver.archivedDataWithRootObject

保存它

但是当我尝试遵守 NSCoding 协议时,出现此错误:'self' 在 self.init 之前使用。这是我的代码:

class MemberRewardsInfo: NSObject, NSCoding {
var id: Int?


  required convenience init?(coder aDecoder: NSCoder) {

    guard let unarchivedId = aDecoder.decodeObjectForKey("id") as? Int

      else {
        return nil
      } 
  }


  func encodeWithCoder(aCoder: NSCoder) {

    aCoder.encodeObject(id, forKey: "id")
  }
}

这很烦人,不知道为什么它不起作用。

错误消息有点误导,但您需要将 init(coder:) 设为指定的初始值设定项。

您需要将 init(code:) 修改为如下内容:

required init?(coder aDecoder: NSCoder) {
    guard let unarchivedId = aDecoder.decodeObjectForKey("id") as? Int else {
            return nil
    }
    self.id = unarchivedId
    super.init()
}

显然它对 convenience 感到不安。假设是,如果你创建一个便利初始化器,它将链接到一个“真正的初始化器。

使用便利初始化器时,只需在块内调用指定的初始化器,在您的情况下为 self.init()。有关解释,请参阅 Apple 文档中的 this example

required convenience init?(coder aDecoder: NSCoder) {
    guard let unarchivedId = aDecoder.decodeObjectForKey("id") as? Int

    else {
        return nil
    }
    self.init()
    self.id = unarchivedId

}