我有多种想要保存到UserDefaults.So的对象类型,我已经编写了一个UserDefaultsManager类,其中我有使用NSKeyedArchiver在UserDefaults中保存对象的方法,以及使用NSKeyedUnarchiver.Here获取对象的方法:
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.But’的参数,并在此基础上将其向下转换为该特定类型,这不是这里的重点。
这里的重点是,我在考虑创建一个协议,比如'UserDefaultsPersistence‘,只有符合该协议的类才能调用这样的方法,并保存在UserDefaults.Here中就是一个例子:
class func archiveObject<T:UserDefaultPersistence>(object:T) -> Data
{
let data = NSKeyedArchiver.archivedData(withRootObject: object)
return data
}但问题是,当我从UserDefaults获取对象时,我将不得不将其向下转换为该特定对象以使用其properties.So。使用协议的全部意义是什么?
发布于 2018-03-15 23:39:21
使用协议的目的是让程序员知道哪些对象是归档的,哪些对象不是应用程序显式支持的对象(尽管,您仍然可以归档其他内容)。此外,由于方法签名强制遵守协议,因此您必须使/声明每个对象都符合它,以便能够将其用于这些方法。这将使您的代码更容易理解和更安全的类型,因为它将防止您意外地尝试存档或解压您不显式支持的东西。
如果您支持许多要存档的对象,我认为使用Core Data将是一个更好的选择。在短期内,设置它需要一些时间,但从长远来看,这将节省您的时间,因为您将能够访问强类型的数据库。UserDefaults实际上是用来做简单的事情的,并不意味着要取代数据库。
https://stackoverflow.com/questions/49292135
复制相似问题