"self" использовалось до ошибки вызова self.init при использовании NSCoding для пользовательского класса

Я пытаюсь закодировать пользовательский класс, чтобы сохранить его, используя 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")
  }
}

это довольно раздражает, не уверен, почему это не работает.

3 ответа

Решение

Сообщение об ошибке вводит в заблуждение, но вам нужно сделать 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 для объяснения.

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

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

}

Другие вопросы по тегам