【问题标题】:How to properly store user settings in Swift?如何在 Swift 中正确存储用户设置?
【发布时间】:2020-10-14 11:21:44
【问题描述】:

我想知道在 Swift 中存储用户设置的最佳方式是什么。对于用户设置,我的意思是简单(小)数据,而不是一些大文件。到目前为止,我使用的类具有我想要保存的所有属性。

所有这些属性都符合 Codable。但是,我没有将整个类保存在 UserDefaults 中,而是单独保存了每个属性。但我不喜欢这种方法。它有几个问题:代码变得更长,因为我必须为每个变量编写 didSet{...}。例如:

var percentage: Double = UserDefaults.standard.double(forKey: "percentage")  {
        didSet {
            UserDefaults.standard.set(percentage, forKey: "percentage")
        }
    }

如你所见,变量名在这里写了4次。所以很有可能出现拼写错误/复制和粘贴错误。

那我为什么不保存整个班级呢?好吧,我注意到如果我在类中添加一个变量,那么即使我给新变量一个默认值,类的解码也不再起作用,并且所有数据都会丢失。

似乎有一种方法可以解决这个问题:手动解码。例如:

 required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        id = try container.decode(UUID.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
        //etc...
    }

但是,手动解码似乎需要我单独解码每个变量。我也不喜欢这样,因为也很有可能忘记一个变量等(所以它与上面的问题相同)。

我还想做的是让用户选择导出和导入设置以及使用 iCloud 进行设置同步。对于前者,最好存储整个 Settings 类(我可以导出和导入 JSON 文件)。

有没有聪明的方法来做到这一点?

感谢您帮助我!

【问题讨论】:

  • “如果我在类中添加一个变量,类的解码将不再起作用”,这听起来很奇怪,还有关于单独解码属性的东西。如果您的类型的属性都符合 Codable,则该类型符合 Codable。也许您可以在this question 或this 中找到解决方案
  • 我对前者的意思是,如果应用程序的数据被编码并且我更新应用程序添加一个新变量,然后将更新推送到设备解码将失败并且所有数据都将迷路了。
  • 好的,你的意思是如果你向类中添加一个新属性。我想对于大多数解决方案来说,这是一个你必须以一种或另一种方式处理的问题
  • 我总是尽量避免使用原始字符串值,因为这可能会导致您注意到的拼写错误,所以我建议使用包含您的字符串值的枚举,这样会更好更高效。 @leonboe1

标签: ios swift persistence


【解决方案1】:

您可能还需要某种类来管理所有用户的内容,如下所示:

class SettingsManager {
    
    private let defaults = UserDefaults.standard
    
    var percentage: Double {
        get { return defaults.value(forKey: "percentage") as? Double ?? 0.0 }
        set { defaults.set(newValue, forKey: "percentage") }
    }
    
}

这样您可以将所需的代码量减少到:

// Retrieve a value
let percentage = SettingsManager().percentage
// Set new value
SettingsManager().percentage = 0.55

理想情况下,您可以使用here 中描述的属性包装器。 这消除了对值进行编码/解码的需要,直到它成为自定义类型。

【讨论】:

  • Property Wrappers 听起来很有趣。谢谢!
猜你喜欢
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2016-04-15
相关资源
最近更新 更多