我花了很长时间试图弄清楚如何在UserManager中存储我的自定义结构的数组。
下面是我的代码:
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
不兼容性错误.
2条答案
按热度按时间eh57zj3b1#
如果你真的想使用Username持久化你的数据,最简单的方法是使用一个类并使其符合NSCoding。关于你的全局var domainSchemas,我建议使用singleton或extend Username并在那里为它创建一个computed属性:
个字符
使用方法:
型
如果你更喜欢Codable的方法,也可以使用UserData来持久化数据:
使用方法:
型
我认为最好的选择是不使用UserList,创建一个单例“共享示例”,在那里声明一个domainSchemas属性,并将你的json数据保存在你的应用程序支持目录的一个子目录中:
使用方法:
型
lzfw57am2#
不需要使用NSKeyedArchiver将自定义对象保存到UserObject中,因为需要将struct改为class,有一个更简单的解决方案,那就是JSONDecoder和JSONEncoder。当您要将自定义对象保存到UserObject中时,首先使用JSONEncoder将其转换为Data,当您要检索时从Userdefaults中创建一个对象,你可以使用JSONDecoder来实现。沿着,我强烈建议你编写一个单独的类或结构来管理你的数据,这样你就可以做到:
字符串
用法:
型