Компилятор Swift выдает ошибку после архивации данных пользовательского класса в UserDefaults
У меня есть массив банковских карт, и я хочу сохранить его один раз, чтобы несколько раз не загружать данные с сервера. Итак, проблема в том, что я не могу заархивировать объекты класса "Карта", которые я объявил. Класс Card состоит из четырех полей, как вы можете видеть, и я считаю, что ключ к этому вопросу лежит в структуре CardInfo, потому что, насколько мне известно, структуры не могут соответствовать протоколу NSCoding. Я нашел решение, которое обернуло структуру в класс, но эти манипуляции не помогли.
struct CardInfo
{
let type: CardType
let title: CardProducer
let number: String
let cvv: Int
}
extension CardInfo{
class Coding: NSObject, NSCoding{
let cardInfo: CardInfo!
init(cardInfo: CardInfo!){
self.cardInfo = cardInfo
super.init()
}
required init?(coder aDecoder:NSCoder) {
guard let type = CardType(rawValue: aDecoder.decodeObject(forKey: "type") as! Int), let title = CardProducer(rawValue:aDecoder.decodeObject(forKey: "title") as! Int), let number = aDecoder.decodeObject(forKey: "number") as? String, let cvv = aDecoder.decodeObject(forKey: "cvv") as? Int else { return nil }
cardInfo = CardInfo(type: type, title: title, number: number, cvv: cvv)
super.init()
}
func encode(with aCoder: NSCoder) {
guard let cardInfo = cardInfo else { return }
aCoder.encode(cardInfo.type.rawValue, forKey: "type")
aCoder.encode(cardInfo.title.rawValue, forKey: "title")
aCoder.encode(cardInfo.number, forKey: "number")
aCoder.encode(cardInfo.cvv, forKey: "cvv")
}
}
}
class Card: NSObject, NSCoding{
let id: Int
let title: String
let info: CardInfo
let balance: Int
init(id: Int, title: String, info: CardInfo, balance: Int) {
self.id = id
self.title = title
self.info = info
self.balance = balance
}
func encode(with aCoder: NSCoder) {
aCoder.encode(self.id, forKey: "id")
aCoder.encode(self.title, forKey: "title")
aCoder.encode(self.balance, forKey: "balance")
aCoder.encode(self.info, forKey: "info")
}
required init?(coder aDecoder: NSCoder) {
self.id = aDecoder.decodeInteger(forKey: "id")
self.title = aDecoder.decodeObject(forKey: "title") as! String
self.info = aDecoder.decodeObject(forKey: "info") as! CardInfo
self.balance = aDecoder.decodeInteger(forKey: "balance")
}
}
Компилятор выдает ошибку после этих строк.
UserDefaults.standard.saveObject(object:self.cards, key: "cards")
UserDefaults.standard.synchronize()
Где saveObject - это мой пользовательский метод, который сохраняет значения по умолчанию, и он отлично работает с объектами других классов.