Swiftui 对字符串映射使用@AppStorage

Swiftui 对字符串映射使用@AppStorage,swiftui,nsuserdefaults,ios14,Swiftui,Nsuserdefaults,Ios14,如何在SwiftUI应用程序中使用@AppStorage作为字符串映射 这就是我想做的: @AppStorage("ratings") var ratings: [String: Double] = [] 但这给了我一个错误消息“调用初始值设定项时没有精确匹配”。查看文档时,似乎只支持少数数据类型。是否可以将其编码为数据?查看@AppStorage的当前可使用此属性包装器存储的唯一值是 Int 双重的 一串 布尔 统一资源定位地址 数据 以及可选的对应项。您还可以存储符合R

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

这就是我想做的:

@AppStorage("ratings") var ratings: [String: Double] = []
但这给了我一个错误消息“调用初始值设定项时没有精确匹配”。查看文档时,似乎只支持少数数据类型。是否可以将其编码为数据?

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

Int 双重的 一串 布尔 统一资源定位地址 数据 以及可选的对应项。您还可以存储符合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的详细信息,请参见此。您可能需要为视图创建一个自定义init,以便从UserDefaults填充状态值

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

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

Int 双重的 一串 布尔 统一资源定位地址 数据 以及可选的对应项。您还可以存储符合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的详细信息,请参见此。您可能需要为视图创建一个自定义init,以便从UserDefaults填充状态值


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

这需要大量处理。非常感谢您的详尽回答!要处理的事情很多。非常感谢您的详尽回答!