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