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

时间:2018-03-15 05:25:16

标签: swift3 protocols userdefaults

我有多个对象类型要保存到UserDefaults.So,我编写了一个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
    }
}

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

  class func archiveObject<T:UserDefaultPersistence>(object:T) -> Data   
{
    let data = NSKeyedArchiver.archivedData(withRootObject: object)
    return data
}

但问题是,当我从UserDefaults获取对象时,我将不得不将其转发到该特定对象以使用其属性。那么使用协议的重点是什么?

1 个答案:

答案 0 :(得分:0)

使用协议的关键在于程序员知道应用程序存档哪些对象并且没有明确支持(尽管如此,您仍然可以存档其他内容)。此外,由于方法签名强制符合协议,因此您必须使/声明每个对象符合它以便能够将它与这些方法一起使用。这将使您的代码更易于理解,更安全,因为它可以防止您意外地尝试归档或取消归档您未明确支持的内容。

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