【问题标题】:Using @AppStorage for string map使用@AppStorage 进行字符串映射
【发布时间】:2020-06-26 20:21:23
【问题描述】:

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

这就是我想做的:

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

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

【问题讨论】:

    标签: swiftui nsuserdefaults ios14


    【解决方案1】:

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

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

    以及它们的可选对应物。您还可以存储符合RawRepresentable 的值,例如符合IntString 的枚举。

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

    @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 来管理它。请参阅此example 了解如何使用onChange。您可能需要为您的视图创建一个自定义初始化,以便填充来自 UserDefaults 的值。

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

    【讨论】:

    • 这需要处理很多。非常感谢您的详尽回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2010-10-11
    • 2019-09-22
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多