使用@AppStorage进行字符串映射

时间:2020-06-26 20:21:23

标签: swiftui nsuserdefaults ios14

如何在SwiftUI应用程序中使用@AppStorage进行字符串映射?

这就是我想要做的:

@AppStorage("ratings") var ratings: [String: Double] = []

但是,这给了我错误消息“在初始化程序调用中没有完全匹配”。查看文档时,似乎仅支持几种数据类型。是否可以将其编码为Data

1 个答案:

答案 0 :(得分:4)

查看@AppStorage的{​​{3}},当前可以使用此属性包装器存储的唯一值是

  • Int
  • Double
  • String
  • Bool
  • URL
  • Data

及其可选对等物。您还可以存储符合RawRepresentable的值,例如符合IntString的枚举。

如果要使用此方法存储字典,则必须将其转换为数据并以这种方式存储。

@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对此进行了详细说明。