【发布时间】:2020-08-12 00:03:35
【问题描述】:
我花了很长时间试图弄清楚如何在 UserDefaults 中存储我的自定义结构的数组。
这是我的代码:
struct DomainSchema: Codable {
var domain: String
var schema: String
}
var domainSchemas: [DomainSchema] {
get {
if UserDefaults.standard.object(forKey: "domainSchemas") != nil {
let data = UserDefaults.standard.value(forKey: "domainSchemas") as! Data
let domainSchema = try? PropertyListDecoder().decode(DomainSchema.self, from: data)
return domainSchema!
}
return nil
}
set {
UserDefaults.standard.set(try? PropertyListEncoder().encode(newValue), forKey: "domainSchemas")
}
}
struct SettingsView: View {
var body: some View {
VStack {
ForEach(domainSchemas, id: \.domain) { domainSchema in
HStack {
Text(domainSchema.domain)
Text(domainSchema.schema)
}
}
// clear history button
}
.onAppear {
if (domainSchemas.isEmpty) {
domainSchemas.append(DomainSchema(domain: "reddit.com", schema: "apollo://"))
}
}
}
}
它给了我这些错误:
无法将类型“DomainSchema”的返回表达式转换为返回类型“[DomainSchema]”
“nil”与返回类型“[DomainSchema]”不兼容
我不确定如何获取对象数组而不是单个对象,或者如何解决 nil 不兼容错误...
【问题讨论】:
-
UserDefaults 并不意味着存储您的应用数据。只需使用 JSONEncoder 对您的集合进行编码并将结果数据写入磁盘。您可以将其保存到您的应用程序支持目录。
-
注意不要使用
value(forKey:)方法。UserDefaults有一个特定的方法来检索Data,称为data(forKey:) -
好吧,这是有道理的。我应该为此使用核心数据还是只写入磁盘?
-
如果您从未使用过Core Data,则无需使用它。这一切都取决于您的应用数据的复杂性。
-
我以前用过Core Data。我真的只有两组需要存储的数据。 1 是一个简单的字符串数组,另一个是我试图用
DomainSchema对象做的这个数组。