3

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

这就是我想要做的:

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

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

4

1 回答 1

13

查看文档@AppStorage了解您当前可以使用此属性包装器存储的唯一值是

  • 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. 您可能需要为您的视图创建一个自定义初始化,以便从 UserDefaults 填充 State 值。

尽管您可以编写自己的属性包装器,但 John Sundell 的这篇文章详细解释了如何做到这一点。

于 2020-06-26T20:48:51.820 回答