Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保存和检索不能在Swift中编码为Userdefaults的结构_Swift_Userdefaults_Custom Object - Fatal编程技术网

保存和检索不能在Swift中编码为Userdefaults的结构

保存和检索不能在Swift中编码为Userdefaults的结构,swift,userdefaults,custom-object,Swift,Userdefaults,Custom Object,我想在代码中保存一个不能修改为UserDefaults的结构。我讨论了许多解决方案,但每个人都建议在结构中使用Codable/NSCoding。我无法编辑结构。有人知道我们如何才能做到这一点吗 我试图将该对象包装到NSDictionary,但在尝试保存时,它崩溃了,并说“尝试插入非属性列表对象”。是因为我的模型中没有值吗 感谢您的帮助 我试图将该对象包装到一本词典中 如果不符合Codable/NSCoding,则无法保存自定义模型。如果不需要符合Codable/NSCoding,则将其保存为常规

我想在代码中保存一个不能修改为UserDefaults的结构。我讨论了许多解决方案,但每个人都建议在结构中使用Codable/NSCoding。我无法编辑结构。有人知道我们如何才能做到这一点吗

我试图将该对象包装到NSDictionary,但在尝试保存时,它崩溃了,并说“尝试插入非属性列表对象”。是因为我的模型中没有值吗

感谢您的帮助

我试图将该对象包装到一本词典中

如果不符合Codable/NSCoding,则无法保存自定义模型。如果不需要符合Codable/NSCoding,则将其保存为常规数组/字典,而不在其中包装任何自定义对象。如果无法更改结构,则为其创建扩展并使其符合Codable

一旦符合Codable,您就可以使用jsonecoder和JSONDecoder在数据之间进行转换,然后从UserDefaults保存/检索数据


您的问题需要包含结构定义。为什么不能在扩展中添加可编码的一致性?如果此结构是在单独的模块中定义的,您没有访问权限,您可以将其扩展为可编码。@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")
}