在Swift中保存和检索无法编码为Userdefaults的结构

时间:2019-05-22 12:50:47

标签: swift userdefaults custom-object

我想在我的代码中保存一个不能修改为RestletEndpoint endpoint = context.getEndpoint("restlet:http://localhost:8080/api", RestletEndpoint.class); endpoint.configureProperties(Collections.singletonMap("bridgeErrorHandler", true)); 的结构。我经历了许多解决方案,但是每个人都建议在 struct 中使用UserDefaults。我无法编辑该结构。有谁知道我们如何实现这一目标。

我试图将对象包装到Codable/NSCoding上,但是在尝试保存时,它崩溃并显示“ 试图插入非属性列表对象”。是因为我的模型中没有nil值吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

如果您无法更改自己的struct,请为其创建一个extension并使其符合Codable

一旦符合Codable,就可以使用JSONEncoderJSONDecoder来回转换数据,然后从UserDefaults保存/检索。

struct Sample {
    var name = "Sample Struct"
}

extension Sample: Codable {

}

let obj = Sample()
let data = try? JSONEncoder().encode(obj)

//Saving in UserDefaults
UserDefaults.standard.set(data, forKey: "SampleStruct")

//Fetching from UserDefaults
if let data = UserDefaults.standard.data(forKey: "SampleStruct") {
    let val = try? JSONDecoder().decode(Sample.self, from: data)
    print(val) //Sample(name: "Sample Struct")
}

答案 1 :(得分:0)

  

我试图将对象包装到NSDictionary

如果不遵循function cambio(){ d3.selectAll(".filter-btn1").each(function(d){ cb = d3.select(this); grp = cb.property("value") if(cb.property("checked")){ if (grp === "Azuless") { alert("Azuless") node.style("opacity", 0.2); } }else{ alert("no chekeado"); node.style("opacity", 2.0); } }) } d3.selectAll(".filter-btn1").on("change",cambio); cambio(); ,则无法保存自定义模型;如果不需要遵循,则应将其保存为通常的Codable/NSCoding,而不会在其中包装任何自定义对象

相关问题