保存和检索不能在Swift中编码为Userdefaults的结构
我想在代码中保存一个不能修改为UserDefaults的结构。我讨论了许多解决方案,但每个人都建议在结构中使用Codable/NSCoding。我无法编辑结构。有人知道我们如何才能做到这一点吗 我试图将该对象包装到NSDictionary,但在尝试保存时,它崩溃了,并说“尝试插入非属性列表对象”。是因为我的模型中没有值吗 感谢您的帮助 我试图将该对象包装到一本词典中 如果不符合Codable/NSCoding,则无法保存自定义模型。如果不需要符合Codable/NSCoding,则将其保存为常规数组/字典,而不在其中包装任何自定义对象。如果无法更改结构,则为其创建扩展并使其符合Codable 一旦符合Codable,您就可以使用jsonecoder和JSONDecoder在数据之间进行转换,然后从UserDefaults保存/检索数据保存和检索不能在Swift中编码为Userdefaults的结构,swift,userdefaults,custom-object,Swift,Userdefaults,Custom Object,我想在代码中保存一个不能修改为UserDefaults的结构。我讨论了许多解决方案,但每个人都建议在结构中使用Codable/NSCoding。我无法编辑结构。有人知道我们如何才能做到这一点吗 我试图将该对象包装到NSDictionary,但在尝试保存时,它崩溃了,并说“尝试插入非属性列表对象”。是因为我的模型中没有值吗 感谢您的帮助 我试图将该对象包装到一本词典中 如果不符合Codable/NSCoding,则无法保存自定义模型。如果不需要符合Codable/NSCoding,则将其保存为常规
您的问题需要包含结构定义。为什么不能在扩展中添加可编码的一致性?如果此结构是在单独的模块中定义的,您没有访问权限,您可以将其扩展为可编码。@Astoria:这给了我一个错误“无法在不同文件的扩展中自动合成'Decodable'的实现”和'Encodable'的实现无法在与类型不同的文件中的扩展名中自动合成。您对此有什么解决方案吗?@iOSManiac自己实现协议方法,因为它在不同的文件中,我遇到了类似“无法在不同文件的扩展名中自动合成'Decodable'的实现”和“Encodable'的实现无法在不同文件的扩展名中自动合成”这样的错误与类型不同的文件。
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")
}