存储UIColor与UserDefaults在Swift 3

    鲍勃·李
    分享

    本文最初发表于iOS极客社区

    所以,到底是什么UserDefaults首先?为什么这个名字这么丑?我们为什么要用它?以及我为什么要写这些?如果你对这些问题至少能给出一个答案,你可以跳到第2部分我讲过用户界面颜色

    先决条件:从心底理解类型转换。换句话说,能够区分作为作为!是吗?你可以从这个视频开始,在这个视频中,我露了脸,说了英语YouTube

    第一阶段:类比

    作为一种传统,让我们从一些时髦而切实的方式开始理解UserDefaults在一个非常高的水平。实际上,这太简单了。我认为没有必要。的UserDefaults对象保存用户数据.因此,当你第一次下载应用程序时,即使电池耗尽,你也可以保存背景颜色/图像等首选项。它可以保存各种各样的东西。如果你的手机有254GB的可用空间,它可以保存254GB的用户数据。但是,有一个大问题。

    它在运行时反刍一切。好吧,之前的句子可能有点模棱两可。让我们试试这个。当你第一次启动一个应用或者视图被加载时,它会把所有东西都吐出来。嗯,。这里有个更好的办法。这就像你跑到厕所,突然拉出憋了5天的便便.你的身体会发生什么变化?你会不知所措。它甚至可能不正确,最重要的是,它会深深地伤害你。同样的道理,你要确保你的大肠里只有足够的便便,这样你(iPhone)就可以像老板一样照顾和处理。

    哈哈对那些新人来说,这就是我思考和执行的方式。打扰一下。没人能阻止我。

    当然,还有另一种方法可以为你和手机解决这个严重的问题。我们可以使用CoreData。你以前可能听过。我将在本周六上午8点发表一篇。请继续关注。

    第二阶段:让我们面对现实

    我们已经玩得够开心了(至少对我来说)。是时候投入工作了。与往常一样,我们必须创建的实例/对象UserDefaults像这样

    违约UserDefaults标准

    现在,对象能够获取一堆值,确切地说,一堆“便便”,每个“便便”都有自己的名字。例如,让我们尝试存储一个' Int '值。

    违约20.forKey“myAge”

    我觉得用便便来比喻有点太令人不安了,所以让我们把这个比喻换成像下面这样可爱的仓鼠吧。

    好的,它应该是这样的,

    ViewControllerui违约UserDefaults标准覆盖函数viewDidLoad超级viewDidLoad违约20.forKey“myAge”打印违约整数forKey“myAge”

    是的,您可以更改的指定值myAge如果你爸爸想改变这个值。

    违约47forKey“myAge”

    就是这样。您只编写了两行代码来离线保存数据UserDefaults.你可以保存诸如性别、血型、身高、体重、表演尺寸、游戏级别等信息。但是,当然,故事还没有结束。就像仓鼠/人类一样,它们不能吃各种各样的东西,比如岩石和钻石。你不会给一个15天大的孩子喂米饭。你呢?(亲爱的苹果UIKit工程师,为什么我们不能…?)

    //你只能喂这些函数保龄球forKey字符串函数浮动forKey字符串函数IntforKey字符串函数任何forKey字符串函数forKey字符串函数URLforKey字符串

    但令人惊讶的是,你可以呕吐出各种东西。我不知道为什么。我想这和我们身体的工作方式有关。

    / /洗涤函数数组forKey字符串函数保龄球forKey字符串函数数据forKey字符串函数字典forKey字符串函数浮动forKey字符串函数整数forKey字符串函数对象forKey字符串函数stringArrayforKey字符串函数字符串forKey字符串函数forKey字符串函数urlforKey字符串函数价值forKey字符串

    另一个问题,如何存储/检索字典?没有直接的方法来设置字典值。当然,有两种方法。

    第一个方法

    的名字(“真正的”“SangJoon李”违约的名字forKey“名称”//存储为任意?如果的名字违约价值forKey“名称”作为(字符串字符串打印的名字//从任意?to [String: String]// ["Real": "SangJoon Lee"]

    第二种方法

    如果的名字违约字典(forKey:“名称”),(字符串字符串{print(name) //从(字符串:任何?来(字符串字符串} / /(“真正的”“SangJoon李”

    好了,好了。但是,我爸爸突然想把背景色保存为粉色…粉色?你的意思是用户界面颜色?这是正确的。来了用户界面颜色是时候认真起来了。振作起来。

    第二部分:UIColor

    你可能已经注意到,处理它并不是一条笔直的道路。我们得稍微调整一下字体。例如,

    我们要转弯了用户界面颜色数据另存为任何?.听起来不错吗?我知道这听起来很荒谬。我会边走边解释的。

    为了从用户界面颜色数据,我们必须依靠一种特殊的编码器,NSKeyedArchiver.想象一下,这个职业就像一个铁匠,用岩石和原始金属制作剑和盾牌。当然,他/她可以来回转换。

    要了解更多信息,请参考Apple的API:NSKeyedArchiver

    NSKeyedArchiver是NSCoder的一个具体子类,提供了一种将对象(和标量值)编码为与体系结构无关的格式的方法,可以存储在文件中。

    代码是这样的。

    扩展UserDefaults函数改变颜色颜色用户界面颜色forKey关键字符串varcolorDataNSData如果颜色颜色colorDataNSKeyedArchiverarchivedDatawithRootObject颜色作为NSDatacolorDataforKey关键//用户默认的内置方法到任何?

    现在,我们已经转变了用户界面颜色数据我们把它保存为任何?因为这是唯一的选择。只是让你知道,任何就像所有东西的超级班级。

    好吧,是时候吐出我们最近保存的“颜色”了。既然我们archievedData变成人类无法理解的东西,是时候unarcheive.但有趣的是,你会呕吐outdata吗?而不是任何?严格来说,我们可以吐出来任何?并将其转换为数据然后用户界面颜色吗?但是让我们保持简单。只是数据?用户界面颜色吗?

    扩展UserDefaults函数colorForKey关键字符串->用户界面颜色var颜色用户界面颜色如果colorData数据forKey关键颜色NSKeyedUnarchiverunarchiveObjectcolorData作为用户界面颜色返回颜色函数改变颜色颜色用户界面颜色forKey关键字符串varcolorDataNSData如果颜色颜色colorDataNSKeyedArchiverarchivedDatawithRootObject颜色作为NSDatacolorDataforKey关键

    现在,我们可以这样做,

    违约改变颜色颜色用户界面颜色红色的forKey“myColor”/ /设置myColor违约colorForKey关键“myColor”/ /得到

    太棒了?就是这样。

    源代码
    Github

    Andyy Hope写了一篇关于如何使用协议将UserDefaults提升到下一个级别的惊人文章。我从他身上学到了很多,我保证他比我聪明得多。看看他的文章。Swift:用户默认协议你不会后悔的。

    Baidu