首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象保存到符合协议的UserDefaults (使用面向协议的编程范式)

将对象保存到符合协议的UserDefaults (使用面向协议的编程范式)
EN

Stack Overflow用户
提问于 2018-03-15 13:25:16
回答 1查看 99关注 0票数 0

我有多种想要保存到UserDefaults.So的对象类型,我已经编写了一个UserDefaultsManager类,其中我有使用NSKeyedArchiver在UserDefaults中保存对象的方法,以及使用NSKeyedUnarchiver.Here获取对象的方法:

代码语言:javascript
复制
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中就是一个例子:

代码语言:javascript
复制
  class func archiveObject<T:UserDefaultPersistence>(object:T) -> Data   
{
    let data = NSKeyedArchiver.archivedData(withRootObject: object)
    return data
}

但问题是,当我从UserDefaults获取对象时,我将不得不将其向下转换为该特定对象以使用其properties.So。使用协议的全部意义是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-03-15 23:39:21

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

如果您支持许多要存档的对象,我认为使用Core Data将是一个更好的选择。在短期内,设置它需要一些时间,但从长远来看,这将节省您的时间,因为您将能够访问强类型的数据库。UserDefaults实际上是用来做简单的事情的,并不意味着要取代数据库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49292135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档