如何在 Swift 中正确存储用户设置?

Posted

技术标签:

【中文标题】如何在 Swift 中正确存储用户设置?【英文标题】:How to properly store user settings in 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 【参考方案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 听起来很有趣。谢谢!

以上是关于如何在 Swift 中正确存储用户设置?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取用户输入并将其存储以稍后在 swift Xcode 中搜索网站

如何使用 jwt 在 React 中正确存储当前用户信息

Swift:如何存储用户偏好? [关闭]

如何从存储在 Firestore (Swift) 中的文档中返回对象

如何添加到当前存储在用户默认值 Swift 4 中的数字

在类之间存储和传递数据的正确方法