如何将@AppStorage用于SwiftUI应用程序中的字符串映射?
这就是我想要做的:
@AppStorage("ratings") var ratings: [String: Double] = []但是这给了我错误消息“调用初始化器时没有完全匹配”。在查看文档时,似乎只支持几个数据类型。可以将其编码为Data
发布于 2020-06-26 20:48:51
查看文档 for @AppStorage,当前可以使用此属性包装器存储的唯一值是
IntDoubleStringBoolURLData和他们的可选对手。您还可以存储符合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和状态来管理它。请参阅如何使用示例的onChange。您可能需要为视图创建自定义init,以便从UserDefaults填充状态值。
虽然您可以编写自己的属性包装器,但John的这个文章详细解释了如何实现它。
发布于 2022-11-22 16:07:13
您可以使用这个数组扩展来使用AppStorage中的结构,只需将其添加到ContentView上面的代码:
extension Array: RawRepresentable where Element: Codable {
public init?(rawValue: String) {
guard let data = rawValue.data(using: .utf8),
let result = try? JSONDecoder().decode([Element].self, from: data)
else {
return nil
}
self = result
}
public var rawValue: String {
guard let data = try? JSONEncoder().encode(self),
let result = String(data: data, encoding: .utf8)
else {
return "[]"
}
return result
}
}然后,您可以为数据类型创建一个结构:
struct Rating: Hashable, Codable {
var howManyStars: Int
var notes: String
}然后,让您的AppStorage数组如下:
@AppStorage("rating") var ratings: [Rating] = []我希望这能帮到你。
https://stackoverflow.com/questions/62602279
复制相似问题