iosswiftnscodingnscoder

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


I'm trying to encode a custom class so I can save it using NSKeyedArchiver.archivedDataWithRootObject

but when I try to conform to the NSCoding protocol, I get this error : 'self' used before self.init. Here is my code:

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")
  }
}

its pretty annoying, not sure why it's not working.


Solution

  • The error message is sort of misleading, but you need to make init(coder:) a designated initializer.

    You need to modify your init(code:) to something like this:

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