Swift - как преобразовать массив объектов, хранящихся локально (файловый менеджер), в более новый? (с добавленными атрибутами) - PullRequest
0 голосов
/ 06 мая 2020

Итак, я исследовал это и все еще ни к чему не привел. По сути, у меня есть массив объектов, которые я сохранил в файловом менеджере. У объекта, скажем, User, есть 2 атрибута.

class User {
    let firstName: String
    let lastName: String
}

После новых обновлений я добавил новый атрибут.

class User {
    let firstName: String
    let lastName: String
    let age: Int
}

Filemanager все еще может идентифицировать файл и читать его. Но поскольку теперь они разные, я не могу проверить свой контроллер представления. Например, я хочу проверить, существует ли этот новый пользователь внутри сохраненных массивов. Он вернет false, поскольку они разные. Любая помощь?

изменить: у моего класса есть и идентификатор

class User: Codable, Equatable, Identifiable {
    var id: { firstName }
   // rest of attributes
}

изменить 2: вот мое хранение и загрузка класса данных

import Foundation
import UIKit

struct DataPersistEngine {

    var users: [User] = []


    struct SavedData: Codable {
        let users: [User]

    }

    private let filePath: URL
    private let encoder = JSONEncoder()
    private let decoder = JSONDecoder()

    init() {
        do {
            filePath = try FileManager.default.url(for: .documentDirectory,
                                                   in: .userDomainMask,
                                                   appropriateFor: nil,
                                                   create: false).appendingPathComponent("SavedDatas")
            if let data = try? Data(contentsOf: filePath) {
                decoder.dataDecodingStrategy = .base64
                let savedData = try decoder.decode(SavedData.self, from: data)
                self.users = savedData.users
            }
        } catch let error {
            fatalError(error.localizedDescription)
        }
    }

    mutating func saveUser(user: User) {
        if users.contains(user) {
            users.removeAll(where: { $0 == user })
        } else {
            users.append(user)
        }
        save()
    }


    private func save() {
        do {
            let savedData = SavedData(users: users)
            let data = try encoder.encode(savedData)
            try data.write(to: filePath, options: .atomicWrite)
        } catch let error {
            print("Error while saving datas: \(error.localizedDescription)")
        }
        encoder.dataEncodingStrategy = .base64
    }

}

1 Ответ

1 голос
/ 06 мая 2020

Реализуйте собственное определение того, что делает два объекта равными

extension User {
    static func == (lhs: User , rhs: User) -> Bool {
        return lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName
    } 
}
...