#ios #arrays #swift #deprecated #nskeyedunarchiver
#iOS #массивы #swift #устарел #nskeyedunarchiver
Вопрос:
Я следил за этим руководством: https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/PersistData.html , который, как я знаю, старый, но работает нормально.
Однако теперь я получаю сообщения об ошибках archiveRootObject(_:toFile:)
и unarchiveObject(withFile:)
теперь они устарели.
Я последовал за ответом, и я думаю, что отсортировал объект archiveRootObject, но понятия не имею, как сделать unarchiveObject.
Это мой обновленный код archiveRootObject:
do {
let saveData = try NSKeyedArchiver.archivedData(withRootObject: meals, requiringSecureCoding: true)
try saveData.write(to: Meal.ArchiveURL) }
catch { print(error) }
Это мой оригинальный, теперь устаревший, неархивируемый код:
private func loadMeals() -> [Meal]? {
return NSKeyedUnarchiver.unarchiveObject(withFile: Meal.ArchiveURL.path) as? [Meal] }
Заранее спасибо
Ответ №1:
В этом случае ваш Meal
класс должен соответствовать NSSecureCoding
протоколу (вместо NSCoding
) и подклассу NSObject
:
class Meal: NSObject, NSSecureCoding {
static var supportsSecureCoding: Bool = true
required init?(coder: NSCoder) {}
func encode(with coder: NSCoder) {}
}
Чтобы разархивировать сохраненный массив Meal
s, вы можете использовать unarchivedArrayOfObjects(ofClass:from:)
функцию, например:
private func loadMeals() -> [Meal]? {
do {
let data = try Data(contentsOf: Meal.ArchiveURL)
return try NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: Meal.self, from: data)
}
catch {
print(error)
return nil
}
}