【问题标题】:Saving and retrieving a struct which is not codable to Userdefaults in Swift在 Swift 中保存和检索不可编码为 Userdefaults 的结构
【发布时间】:2019-05-22 12:50:47
【问题描述】:

我想在我的代码中保存一个无法修改为UserDefaults 的结构。我经历了许多解决方案,但每个人都建议在 struct 中使用Codable/NSCoding。我无法编辑结构。有谁知道我们如何实现这一目标。

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

感谢任何帮助。

【问题讨论】:

  • edit 你的问题包括struct 定义。为什么不能在extension 中添加Codable 一致性?
  • 事件如果这个结构是在单独的模块中定义的,你没有访问权限,你可以将它扩展为Codable
  • @Astoria:它给了我错误“'Decodable' 的实现不能在不同文件的扩展中自动合成到类型'并且'Encodable' 的实现不能在一个在不同的文件中扩展该类型。你有什么解决办法吗?
  • @iOSManiac 自己实现协议方法

标签: swift userdefaults custom-object


【解决方案1】:

如果您无法更改您的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")
}

【讨论】:

  • 因为它在不同的文件中,所以我收到错误,例如“无法在不同文件的扩展中自动合成“可解码”的实现与类型,并且“可编码”的实现不能自动在与该类型不同的文件的扩展中合成。
【解决方案2】:

我试图将对象包装到一个 NSDictionary

如果不符合Codable/NSCoding,则无法保存自定义模型,如果您不需要符合,则将其保存为通常的Array/Dictionary,而不在内部包装任何自定义对象

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 2015-03-07
    • 2021-02-07
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多