如何在不带参数的情况下将 swift 中的 class 保存到 userdefaults
How to save class in swift to userdefaults without arguments
我找不到适合 post 的社区,如果这离题了,我很抱歉。我无法将 swift 中的自定义 class 保存到 userdefaults。我看到的每个其他答案都需要使用参数初始化 class 但我正在寻找一种编码时的解决方法。我还想知道 userdefaults 是否是最佳选择?这是大量数据,但我试图避免使用关系数据库,因为我只是想直接保存此数据结构而不创建模式。它在向中介对象数组添加中介然后尝试对数据进行编码时产生错误。
我的代码:
import Foundation
class SavedData: NSObject, NSCoding {
func encode(with aCoder: NSCoder) {
aCoder.encode(mediations, forKey: "mediations")
aCoder.encode(name, forKey: "name")
}
required convenience init?(coder aDecoder: NSCoder) {
let name = aDecoder.decodeObject(forKey: "name") as! String
let mediations = aDecoder.decodeObject(forKey: "mediations") as! [Mediation]
self.init(name: name, mediations: mediations)
}
init(name: String, mediations: [Mediation]) {
// Get Saved Mediations from memory
self.mediations = mediations
self.name = name
}
public var mediations: [Mediation]
var name: String = "foo"
class Mediation {
init(name: String, role: String, data: [[String]]) {
self.name = name
self.data = Data(defendant: data[0], plaintiff: data[1])
}
var role: String = ""
var name: String = ""
var data: Data
class Data {
init(defendant: [String], plaintiff: [String]) {
self.defendant = defendant
self.plaintiff = plaintiff
}
var plaintiff: [String] = []
var defendant: [String] = []
}
}
func new_mediation (name: String, role: String, data: [[String]]) {
let mediation = Mediation(name: name, role: role, data: data)
self.mediations.append(mediation)
}
}
我最喜欢将自定义数组 class 保存到 UserDefaults 的方法是使用 JSONEncoder。
因此请确保您的调解可编码:
Class Mediation: Codable
然后保存数组:
let encodedMediations = try! JSONEncoder().encode(mediations)
UserDefaults.standard.set(encodedMediations, forKey: "SavedMediations")
最后获取数组:
if let savedMediations = UserDefaults.standard.data(forKey: "SavedMediations") {
let decodedMediations = try! JSONDecoder().decode([Mediation].self, from: savedMediations)
}
我找不到适合 post 的社区,如果这离题了,我很抱歉。我无法将 swift 中的自定义 class 保存到 userdefaults。我看到的每个其他答案都需要使用参数初始化 class 但我正在寻找一种编码时的解决方法。我还想知道 userdefaults 是否是最佳选择?这是大量数据,但我试图避免使用关系数据库,因为我只是想直接保存此数据结构而不创建模式。它在向中介对象数组添加中介然后尝试对数据进行编码时产生错误。
我的代码:
import Foundation
class SavedData: NSObject, NSCoding {
func encode(with aCoder: NSCoder) {
aCoder.encode(mediations, forKey: "mediations")
aCoder.encode(name, forKey: "name")
}
required convenience init?(coder aDecoder: NSCoder) {
let name = aDecoder.decodeObject(forKey: "name") as! String
let mediations = aDecoder.decodeObject(forKey: "mediations") as! [Mediation]
self.init(name: name, mediations: mediations)
}
init(name: String, mediations: [Mediation]) {
// Get Saved Mediations from memory
self.mediations = mediations
self.name = name
}
public var mediations: [Mediation]
var name: String = "foo"
class Mediation {
init(name: String, role: String, data: [[String]]) {
self.name = name
self.data = Data(defendant: data[0], plaintiff: data[1])
}
var role: String = ""
var name: String = ""
var data: Data
class Data {
init(defendant: [String], plaintiff: [String]) {
self.defendant = defendant
self.plaintiff = plaintiff
}
var plaintiff: [String] = []
var defendant: [String] = []
}
}
func new_mediation (name: String, role: String, data: [[String]]) {
let mediation = Mediation(name: name, role: role, data: data)
self.mediations.append(mediation)
}
}
我最喜欢将自定义数组 class 保存到 UserDefaults 的方法是使用 JSONEncoder。
因此请确保您的调解可编码:
Class Mediation: Codable
然后保存数组:
let encodedMediations = try! JSONEncoder().encode(mediations)
UserDefaults.standard.set(encodedMediations, forKey: "SavedMediations")
最后获取数组:
if let savedMediations = UserDefaults.standard.data(forKey: "SavedMediations") {
let decodedMediations = try! JSONDecoder().decode([Mediation].self, from: savedMediations)
}