如何@AppStorage
在 SwiftUI 应用程序中使用字符串映射?
这就是我想要做的:
@AppStorage("ratings") var ratings: [String: Double] = []
但这给了我错误消息“在调用初始化程序时没有完全匹配”。查看文档时,似乎只支持少数数据类型。可以将其编码为Data
?
如何@AppStorage
在 SwiftUI 应用程序中使用字符串映射?
这就是我想要做的:
@AppStorage("ratings") var ratings: [String: Double] = []
但这给了我错误消息“在调用初始化程序时没有完全匹配”。查看文档时,似乎只支持少数数据类型。可以将其编码为Data
?
查看文档以@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 的这篇文章详细解释了如何做到这一点。