使用@AppStorage 进行字符串映射

Using @AppStorage for string map

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

这就是我想要做的:

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

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

查看 @AppStoragedocumentation,您当前可以使用此 属性 包装器存储的唯一值是

  • 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来管理它。请参阅有关如何使用 onChangeexample。您可能需要为您的视图创建一个自定义初始化,以便从 UserDefaults 中填充 State 值。

虽然您可以编写自己的 属性 包装器,但 John Sundell 的这篇 article 详细解释了如何做。