如何在没有参数的情况下快速将类保存到用户默认值

Posted

技术标签:

【中文标题】如何在没有参数的情况下快速将类保存到用户默认值【英文标题】:How to save class in swift to userdefaults without arguments 【发布时间】:2019-08-06 20:45:04 【问题描述】:

我找不到合适的社区来发帖,所以如果这离题了,我很抱歉。我无法将自定义类快速保存到用户默认值。我看到的所有其他答案都需要使用参数初始化类,但我正在寻找一种在编码时解决这个问题的方法。我还想知道 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)



【问题讨论】:

你做了什么?你怎么认为?为什么要避免关系数据库?你实现了什么代码? 感谢您的回复!这是否更好? @impression7vx 错误是什么? @impression7vx 向对象数组添加中介时出现无法识别的选择器错误,我想我已经修复了它,但我想知道如何在不提供参数的情况下对类进行编码? 【参考方案1】:

我最喜欢将自定义类数组保存到 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)

【讨论】:

以上是关于如何在没有参数的情况下快速将类保存到用户默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有保存/打开对话框的情况下将文件从服务器下载到客户端机器到浏览器中设置的默认文件夹中?

为啥我不能将类构造函数参数设置为默认值?

如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4

使用 swift 将数组保存和检索到用户默认值

我的用户默认值没有保存我的滑块值 - Swift 3

如何在swift中将json数组保存和检索到用户默认值?