Заранее спасибо за помощь.
Я хочу сохранить данные, такие как статистика пользователя. Допустим, у меня есть модель данных, класс 'Stats' с несколькими свойствами, и он сохраняется на устройстве пользователя. Предположим, что я выпустил приложение, пользователи записывают свою статистику, но позже я хочу внести изменения в класс - больше или меньше свойств, возможно, даже переименовать их (и т. Д. c.), До выхода новой версии сборки. , Но после внесения этих изменений тип «Статистика» теперь отличается от того, который пользователи сохранили на своем устройстве, поэтому он не сможет декодировать, и похоже, что все предыдущие данные пользователя до этого момента будут быть потерянным / недостижимым.
Как добавить такие изменения в класс таким образом, чтобы PropertyListDecoder все еще мог декодировать статистику, которая все еще находится на устройстве пользователя?
Это в основном то, что у меня есть:
class Stat: Codable {
let questionCategory = questionCategory()
var timesAnsweredCorrectly: Int = 0
var timesAnsweredFirstTime: Int = 0
var timesFailed: Int = 0
static func saveToFile(stats: [Stat]) {
let propertyListEncoder = PropertyListEncoder()
let encodedSettings = try? propertyListEncoder.encode(stats)
try? encodedSettings?.write(to: archiveURL, options: .noFileProtection)
}
static func loadFromFile() -> [Stat]? {
let propertyListDecoder = PropertyListDecoder()
if let retrievedSettingsData = try? Data(contentsOf: archiveURL), let decodedSettings = try? propertyListDecoder.decode([Stat].self, from: retrievedSettingsData) {
return decodedSettings
} else {
return nil
}
}
}
static let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
static let archiveURL = documentsDirectory.appendingPathComponent("savedVerbStats").appendingPathExtension("plist")
Кажется, что даже простое добавление нового свойства в Stat приведет к тому, что предыдущие сохраненные данные пользователя станут не декодируемыми как тип 'Stat', и loadFromFile () вернет ноль.
Любой совет будет отличным! Я уверен, что я поступаю об этом неправильно. Я полагал, что массив [Stat] будет слишком большим, чтобы его можно было сохранить в UserDefaults, но даже тогда я думаю, что эта проблема все еще существует ... Не могу найти что-нибудь об этом в Интернете; кажется, что, когда ваши пользователи используют постоянный класс, вы не можете его изменить. Я попытался использовать значения по умолчанию для новых свойств, но результат тот же.
Единственное решение, которое я могу придумать, - это разбить класс на литералы и вместо этого сохранить все эти в виде кортежа / словаря. Затем я декодировал бы эти необработанные данные и имел бы функцию для сборки и создания класса из любых соответствующих данных, которые все еще могут быть взяты из старой версии типа «Stat». Похоже, большой обходной путь, и я уверен, что вы, ребята, знаете гораздо лучше.
Спасибо !!