【发布时间】:2020-06-26 20:21:23
【问题描述】:
如何在 SwiftUI 应用程序中使用 @AppStorage 作为字符串映射?
这就是我想做的:
@AppStorage("ratings") var ratings: [String: Double] = []
但这给了我错误消息“在调用初始化程序时没有完全匹配”。查看文档时,似乎只支持少数数据类型。可以编码成Data?
【问题讨论】:
标签: swiftui nsuserdefaults ios14
如何在 SwiftUI 应用程序中使用 @AppStorage 作为字符串映射?
这就是我想做的:
@AppStorage("ratings") var ratings: [String: Double] = []
但这给了我错误消息“在调用初始化程序时没有完全匹配”。查看文档时,似乎只支持少数数据类型。可以编码成Data?
【问题讨论】:
标签: swiftui nsuserdefaults ios14
查看documentation 中的@AppStorage,您当前可以使用此属性包装器存储的唯一值是
IntDoubleStringBoolURLData以及它们的可选对应物。您还可以存储符合RawRepresentable 的值,例如符合Int 或String 的枚举。
如果您想使用此方法存储字典,则必须将其转换为数据并以这种方式存储。
@AppStorage("ratings")
var ratings: Data = Data() // we need to initialize it with something
然后我们可以使用
let data = ["Hello": 5.0]
guard let ratings = try? JSONEncoder().encode(data) else { return }
self.ratings = ratings
如果我们想检索它,我们可以执行以下操作:
guard let decodedRatings = try? JSONDecoder().decode([String:Double].self, from: ratings) else { return }
print(decodedRatings)
否则你将不得不直接使用 UserDefaults,你总是可以使用 onChange 和 State 来管理它。请参阅此example 了解如何使用onChange。您可能需要为您的视图创建一个自定义初始化,以便填充来自 UserDefaults 的值。
尽管您可以编写自己的属性包装器,但 John Sundell 的 article 详细解释了如何做到这一点。
【讨论】: