存储UIColor与UserDefaults在Swift 3
本文最初发表于iOS极客社区.
所以,到底是什么UserDefaults
首先?为什么这个名字这么丑?我们为什么要用它?以及我为什么要写这些?如果你对这些问题至少能给出一个答案,你可以跳到第2部分我讲过用户界面颜色
.
先决条件:从心底理解类型转换。换句话说,能够区分作为
,作为!
,是吗?
你可以从这个视频开始,在这个视频中,我露了脸,说了英语YouTube.
第一阶段:类比
作为一种传统,让我们从一些时髦而切实的方式开始理解UserDefaults
在一个非常高的水平。实际上,这太简单了。我认为没有必要。的UserDefaults
对象保存用户数据.因此,当你第一次下载应用程序时,即使电池耗尽,你也可以保存背景颜色/图像等首选项。它可以保存各种各样的东西。如果你的手机有254GB的可用空间,它可以保存254GB的用户数据。但是,有一个大问题。
它在运行时反刍一切。好吧,之前的句子可能有点模棱两可。让我们试试这个。当你第一次启动一个应用或者视图被加载时,它会把所有东西都吐出来。嗯,。这里有个更好的办法。这就像你跑到厕所,突然拉出憋了5天的便便.你的身体会发生什么变化?你会不知所措。它甚至可能不正确,最重要的是,它会深深地伤害你。同样的道理,你要确保你的大肠里只有足够的便便,这样你(iPhone)就可以像老板一样照顾和处理。
哈哈对那些新人来说,这就是我思考和执行的方式。打扰一下。没人能阻止我。
当然,还有另一种方法可以为你和手机解决这个严重的问题。我们可以使用CoreData。你以前可能听过。我将在本周六上午8点发表一篇。请继续关注。
第二阶段:让我们面对现实
我们已经玩得够开心了(至少对我来说)。是时候投入工作了。与往常一样,我们必须创建的实例/对象UserDefaults
像这样
让违约=UserDefaults.标准
现在,对象能够获取一堆值,确切地说,一堆“便便”,每个“便便”都有自己的名字。例如,让我们尝试存储一个' Int '值。
违约.集(20.,forKey:“myAge”)
我觉得用便便来比喻有点太令人不安了,所以让我们把这个比喻换成像下面这样可爱的仓鼠吧。
好的,它应该是这样的,
类ViewController:ui{让违约=UserDefaults.标准覆盖函数viewDidLoad(){超级.viewDidLoad()违约.集(20.,forKey:“myAge”)打印(违约.整数(forKey:“myAge”))}}
是的,您可以更改的指定值myAge
如果你爸爸想改变这个值。
违约.集(47,forKey:“myAge”)
就是这样。您只编写了两行代码来离线保存数据UserDefaults
.你可以保存诸如性别、血型、身高、体重、表演尺寸、游戏级别等信息。但是,当然,故事还没有结束。就像仓鼠/人类一样,它们不能吃各种各样的东西,比如岩石和钻石。你不会给一个15天大的孩子喂米饭。你呢?(亲爱的苹果UIKit工程师,为什么我们不能…?)
//你只能喂这些函数集(保龄球,forKey:字符串)函数集(浮动,forKey:字符串)函数集(Int,forKey:字符串)函数集(任何?,forKey:字符串)函数集(双,forKey:字符串)函数集(URL?,forKey:字符串)
但令人惊讶的是,你可以呕吐出各种东西。我不知道为什么。我想这和我们身体的工作方式有关。
/ /洗涤函数数组(forKey:字符串)函数保龄球(forKey:字符串)函数数据(forKey:字符串)函数字典(forKey:字符串)函数浮动(forKey:字符串)函数整数(forKey:字符串)函数对象(forKey:字符串)函数stringArray(forKey:字符串)函数字符串(forKey:字符串)函数双(forKey:字符串)函数url(forKey:字符串)函数价值(forKey:字符串)
另一个问题,如何存储/检索字典
?没有直接的方法来设置字典值。当然,有两种方法。
第一个方法
让的名字=(“真正的”:“SangJoon李”]违约.集(的名字,forKey:“名称”)//存储为任意?如果让的名字=违约.价值(forKey:“名称”)作为?(字符串:字符串]{打印(的名字)//从任意?to [String: String]}// ["Real": "SangJoon Lee"]
第二种方法
如果让的名字=违约.字典(forKey:“名称”),?(字符串:字符串]{print(name) //从(字符串:任何]?来(字符串:字符串]} / /(“真正的”:“SangJoon李”]
好了,好了。但是,我爸爸突然想把背景色保存为粉色…粉色?你的意思是用户界面颜色
?这是正确的。来了用户界面颜色
是时候认真起来了。振作起来。
第二部分:UIColor
你可能已经注意到,处理它并不是一条笔直的道路。我们得稍微调整一下字体。例如,
我们要转弯了用户界面颜色
成数据
另存为任何?
.听起来不错吗?我知道这听起来很荒谬。我会边走边解释的。
为了从用户界面颜色
来数据
,我们必须依靠一种特殊的编码器,NSKeyedArchiver
.想象一下,这个职业就像一个铁匠,用岩石和原始金属制作剑和盾牌。当然,他/她可以来回转换。
要了解更多信息,请参考Apple的API:NSKeyedArchiver
NSKeyedArchiver是NSCoder的一个具体子类,提供了一种将对象(和标量值)编码为与体系结构无关的格式的方法,可以存储在文件中。
代码是这样的。
扩展UserDefaults{函数改变颜色(颜色:用户界面颜色?,forKey关键:字符串){varcolorData:NSData?如果让颜色=颜色{colorData=NSKeyedArchiver.archivedData(withRootObject:颜色)作为NSData?}集(colorData,forKey:关键)//用户默认的内置方法到任何?}}
现在,我们已经转变了用户界面颜色
来数据
我们把它保存为任何?
因为这是唯一的选择。只是让你知道,任何
就像所有东西的超级班级。
好吧,是时候吐出我们最近保存的“颜色”了。既然我们archievedData
变成人类无法理解的东西,是时候unarcheive
.但有趣的是,你会呕吐outdata吗?
而不是任何?
严格来说,我们可以吐出来任何?
并将其转换为数据
然后用户界面颜色吗?
但是让我们保持简单。只是数据?
来用户界面颜色吗?
扩展UserDefaults{函数colorForKey(关键:字符串)->用户界面颜色?{var颜色:用户界面颜色?如果让colorData=数据(forKey:关键){颜色=NSKeyedUnarchiver.unarchiveObject(与:colorData)作为?用户界面颜色}返回颜色}函数改变颜色(颜色:用户界面颜色?,forKey关键:字符串){varcolorData:NSData?如果让颜色=颜色{colorData=NSKeyedArchiver.archivedData(withRootObject:颜色)作为NSData?}集(colorData,forKey:关键)}}
现在,我们可以这样做,
违约.改变颜色(颜色:用户界面颜色.红色的,forKey:“myColor”)/ /设置让myColor=违约.colorForKey(关键:“myColor”)/ /得到
太棒了?就是这样。
源代码
Github
Andyy Hope写了一篇关于如何使用协议将UserDefaults提升到下一个级别的惊人文章。我从他身上学到了很多,我保证他比我聪明得多。看看他的文章。Swift:用户默认协议你不会后悔的。