如何在SwiftUI应用程序中使用@AppStorage
进行字符串映射?
这就是我想要做的:
@AppStorage("ratings") var ratings: [String: Double] = []
但是,这给了我错误消息“在初始化程序调用中没有完全匹配”。查看文档时,似乎仅支持几种数据类型。是否可以将其编码为Data
?
答案 0 :(得分:4)
查看@AppStorage
的{{3}},当前可以使用此属性包装器存储的唯一值是
Int
Double
String
Bool
URL
Data
及其可选对等物。您还可以存储符合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来对其进行管理。有关如何使用onChange
的信息,请参见此documentation。您可能需要为视图创建自定义init,以便从UserDefaults中填充State的值。
尽管您可以编写自己的属性包装器,但是John Sundell的example对此进行了详细说明。