SwiftyJD SwiftyJD - 3 months ago 22
Swift Question

'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.

Answer

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