将对象保存到确认协议的 UserDefaults(使用面向协议的编程范例)

Posted

技术标签:

【中文标题】将对象保存到确认协议的 UserDefaults(使用面向协议的编程范例)【英文标题】:Saving objects to UserDefaults that confirm to a protocol(using protocol oriented programming paradigm) 【发布时间】:2018-03-15 05:25:16 【问题描述】:

我有多个要保存到 UserDefaults 的对象类型。所以,我编写了一个 UserDefaultsManager 类,其中我有使用 NSKeyedArchiver 将对象保存在 UserDefaults 中并使用 NSKeyedUnarchiver 获取的方法。方法如下:

class UserDefaultsManager 

    class func saveToUserDefaults(object:Any, Key:String)
    
        let data = NSKeyedArchiver.archivedData(withRootObject: object)
        UserDefaults.standard.setValue(data, forKey: key)
        UserDefaults.standard.synchronize()
    

    class func userDefaultsForKey(_ key:String) -> Any 
    
        let data = UserDefaults.standard.value(forKey: key)
        let object = NSKeyedUnarchiver.unarchiveObject(with: data as! Data)
        return object as! LoginUser
    

如您所见,要保存的对象可以是任何类型,因此我将参数定义为“任何”。现在,当我需要获取对象时,我将其转换为“LoginUser”对象类型,然后将其返回。 我还可以添加另一个名为“类型”的参数,并在此基础上将其向下转换为该特定类型。但这不是重点。 这里的重点是我正在考虑创建一个协议,例如“UserDefaultsPersistence”,并且只有确认该协议的类才能调用此类方法并保存在 UserDefaults 中。这是一个示例:

  class func archiveObject<T:UserDefaultPersistence>(object:T) -> Data   

    let data = NSKeyedArchiver.archivedData(withRootObject: object)
    return data

但问题是,当我从 UserDefaults 获取对象时,我必须将其向下转换为特定对象才能使用其属性。那么使用协议的全部意义何在?

【问题讨论】:

【参考方案1】:

使用协议的目的是让程序员知道应用程序明确支持和不支持归档哪些对象(尽管您仍然可以归档其他内容)。此外,由于方法签名强制遵守协议,因此您必须使/声明每个对象都符合它才能将其与这些方法一起使用。这将使您的代码更易于理解且类型更安全,因为它可以防止您意外尝试归档或取消归档您未明确支持的内容。

如果您支持许多正在归档的对象,我认为使用 Core Data 会是一个更好的选择。在短期内,设置需要一些时间,但从长远来看,它会节省您的时间,因为您将可以访问强类型数据库。 UserDefaults 确实是为了简单的事情,并不是要替换数据库。

【讨论】:

以上是关于将对象保存到确认协议的 UserDefaults(使用面向协议的编程范例)的主要内容,如果未能解决你的问题,请参考以下文章

保存到 UserDefaults 被调用 19 次

Swift 3:将数组保存到 UserDefaults 错误 - 对象数与键数不同

在 UserDefaults 中保存不同对象类型的数组

UserDefaults不保存值iphone

使用 UserDefaults 保存数据的正确事件是啥?

尝试将数组保存到 UserDefaults