unarchiveObject (с файлом) устарел

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