Swift - 如何将本地存储的对象数组(文件管理器)转换为更新的对象数组? (具有附加属性)
Swift - how to convert an array of objects stored locally (filemanager) to a newer one? (with added attributes)
所以我一直在研究这个,但仍然一无所获。
基本上,我有一个存储到文件管理器的对象数组。对象,比如 User,有 2 个属性。
class User {
let firstName: String
let lastName: String
}
根据新的更新,我添加了新的属性。
class User {
let firstName: String
let lastName: String
let age: Int
}
文件管理器仍然能够识别文件并读取它。但由于它们现在不同了,我无法对我的视图控制器执行检查。例如,我想检查这个新用户是否存在于存储的数组中。它将 return false 因为它们不同。
有帮助吗?
编辑:
我的 class 确实有并且 id
class User: Codable, Equatable, Identifiable {
var id: { firstName }
// rest of attributes
}
编辑2:
这是我存储和加载数据 class
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: { [=14=] == 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
}
}
实现你自己对什么使两个对象相等的定义
extension User {
static func == (lhs: User , rhs: User) -> Bool {
return lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName
}
}
所以我一直在研究这个,但仍然一无所获。 基本上,我有一个存储到文件管理器的对象数组。对象,比如 User,有 2 个属性。
class User {
let firstName: String
let lastName: String
}
根据新的更新,我添加了新的属性。
class User {
let firstName: String
let lastName: String
let age: Int
}
文件管理器仍然能够识别文件并读取它。但由于它们现在不同了,我无法对我的视图控制器执行检查。例如,我想检查这个新用户是否存在于存储的数组中。它将 return false 因为它们不同。 有帮助吗?
编辑: 我的 class 确实有并且 id
class User: Codable, Equatable, Identifiable {
var id: { firstName }
// rest of attributes
}
编辑2: 这是我存储和加载数据 class
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: { [=14=] == 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
}
}
实现你自己对什么使两个对象相等的定义
extension User {
static func == (lhs: User , rhs: User) -> Bool {
return lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName
}
}