首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用@AppStorage进行字符串映射

使用@AppStorage进行字符串映射
EN

Stack Overflow用户
提问于 2020-06-26 20:21:23
回答 2查看 3.4K关注 0票数 5

如何将@AppStorage用于SwiftUI应用程序中的字符串映射?

这就是我想要做的:

代码语言:javascript
复制
@AppStorage("ratings") var ratings: [String: Double] = []

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-26 20:48:51

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

  • Int
  • Double
  • String
  • Bool
  • URL
  • Data

和他们的可选对手。您还可以存储符合RawRepresentable的值,如符合IntString的枚举。

如果要使用此方法存储字典,则必须将其转换为数据并以这种方式存储。

代码语言:javascript
复制
@AppStorage("ratings")
var ratings: Data = Data() // we need to initialize it with something

然后我们可以使用

代码语言:javascript
复制
let data = ["Hello": 5.0]
guard let ratings = try? JSONEncoder().encode(data) else { return }
self.ratings = ratings

如果我们想检索它,我们可以执行以下操作:

代码语言:javascript
复制
guard let decodedRatings = try? JSONDecoder().decode([String:Double].self, from: ratings) else { return }
print(decodedRatings)

否则,您将不得不直接使用UserDefaults,您可以始终使用onChange和状态来管理它。请参阅如何使用示例onChange。您可能需要为视图创建自定义init,以便从UserDefaults填充状态值。

虽然您可以编写自己的属性包装器,但John的这个文章详细解释了如何实现它。

票数 17
EN

Stack Overflow用户

发布于 2022-11-22 16:07:13

您可以使用这个数组扩展来使用AppStorage中的结构,只需将其添加到ContentView上面的代码:

代码语言:javascript
复制
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                                                        
    }
}

然后,您可以为数据类型创建一个结构:

代码语言:javascript
复制
struct Rating: Hashable, Codable {
var howManyStars: Int
var notes: String
}

然后,让您的AppStorage数组如下:

代码语言:javascript
复制
@AppStorage("rating") var ratings: [Rating] = []

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62602279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档