博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记10 Property List
阅读量:6605 次
发布时间:2019-06-24

本文共 2614 字,大约阅读时间需要 8 分钟。

  这一话来讲一个AnyObject的应用:Property List。

property list不是任何一种类型,它属于一种工具类的东西。它表面上是AnyObject,但是在后台,它是NSString、NSArray、NSDictionary、NSNumer、NSData和NSDate这六种类型中的一种,或者它们桥接到Swift中的版本。我们为什么要用property list呢,它看起来很笨重,我们需要大量的类型转换。

实际上有两个原因,第一property list要用来隐式地传递数据,就像浏览器中的cookie一样,它们只有创建者才知道如何解释它们的一组数据,只有创建者才知道里面具体是Int还是String之类的,其他人能看到的只有AnyObject,所以他们嫩过的就是把它传递给其他人。

另一个原因是property list可以用于泛型的数据结构,泛型的数据结构可以用来写入磁盘,或者通过网络传播。

property list在IOS中有一个很好用的东西叫做NSUserDefaults(我在UI专项训练这个系列中使用了NSUserDefaults来记录用户登录情况,从而判断是否加载引导页)。NSUserDefaults就像一个微型的数据库,它只会存储property list,存储那些诸如设置、用户信息的东西。由于它的性能不高,所以千万不要用它存储一些图片什么的比较大的数据,只用它来存储property list,比如日期、字符串、数字什么的。它可以像字典一样存储和导出property list,而且它本身就是一个字典。下面是它的一些方法。

它有一个key:value的字典,但是只存储property list。当你的APP关闭时,NSUserDefaults存储的东西依然存在,它永久保存这些数据。一般来说一个字典保存在堆中,当你的APP关掉它就消失了,但是这个保留着,所以说它像个数据库。

那么我们该如何使用它呢?

首先你使用standarUserDefaults这个方法,给你一个NSUserDefaults的实例。你总是使用同一个实例,然后你就可以给它发送消息,使用objectForKey来读取一个信息或者使用setObject来写一个信息。通常数据会自动保存,但是也有强制保存数据的办法aunchronize,类似于save方法。那么既然有自动保存为什么还需要强制保存呢,这是因为保存机制是当你的App从前台转到后台了,那时它会保存数据。因此它不会总在我们需要的时候保存数据,这就需要我们强制保存数据,因此这种方法是需要的。特别是当你debugging的时候,中断操作不会保存数据,我们需要做一些保存。何况synchronize操作代价并不高。

现在来展示一个Demo

在我们的计算器项目中,希望我们的CalculatorBrain能够给我们提供一个program,我们与这个program交互的数据都是AnyObject类型的,这样别人就看不到它到底是什么。

回到我们之前的Calculator项目中,在CalculatorBrain中添加如下代码:

var program:AnyObject{//确保它是一个propertylist        get{        var returnValue = Array
() for op in opStack{ returnValue.append(op.description) } return returnValue } set{ } }
我们知道Array是一个AnyObject类型的,因为它被桥接过了。但是get中的代码显得有点多,之前介绍过一个叫做map的函数,正好派上用场,简化后的写法:

get{            return opStack.map{$0.description}        }
map后面是一个闭包,在闭包中把opStack中的每一个单个元素的字符描述返回到一个新的数组中。现在有人给我们返回了一个program,我们想要在其中加上我们的opStack,首先我们要确认的是别人给我们的这个数组中的数据类型。

var program:AnyObject{//确保它是一个propertylist        get{            return opStack.map{$0.description}        }        set{            if let opSymbols = newValue as? Array
{ var newOpStack = [Op]() for opSymbol in opSymbols{ if let op = knownOps[opSymbol]{ newOpStack.append(op) } else if let operand = NSNumberFormatter().numberFromString(opSymbol)?.doubleValue { newOpStack.append(.Operand(operand)) } opStack = newOpStack } } } }
set中的代码不打算细讲,如果你对计算器这个项目很熟悉的话应该是很好理解的。另外我们可以使用一种新的命名方式,那就是替身:

typealias PropertyList = AnyObject    var program:PropertyList{//确保它是一个propertylist
这样更鲜明一点。

你可能感兴趣的文章
陈松松:推荐制作高清视频必备的3个工具
查看>>
陈松松:从新手到高手学习视频营销的三个步骤
查看>>
Mandriva基础知识之6:Ruby1.9.2安装
查看>>
JavaAPI详解系列(5):String类(5)
查看>>
javaScript实现焦点轮播图界面效果(三)
查看>>
Exchange powershell
查看>>
java学习,模板的理解
查看>>
博为峰Java技术文章 ——JavaSE Swing JFileChooser组件Ⅱ
查看>>
esxi虚机Windows server 2012忘记密码解决办法
查看>>
微信小程序的视图容器—swiper
查看>>
(SQL)比较一个 (SQL)比较一个集合是否在另一个集合里存在的方法
查看>>
创业---学习思想里程----漫漫道路
查看>>
oracle中几个概念
查看>>
如何更好地设计RESTful API?
查看>>
写着好玩的(4)--交换机他爸
查看>>
谷歌宣布收购全球最大数据科学社区Kaggle
查看>>
cisco-ccna-第五章测试-work1-汉语
查看>>
RHEL6.7下,安装vnc远程桌面。
查看>>
CCNA-(10)-思科交换机IOS操作和管理
查看>>
linux——常用命令用法介绍
查看>>