【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

新的一话中我们将讲讲Foundation的一些相关知识,首先来看AnyObject。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

为了方便理解,你可以任务AnyObject是某种类型,虽然它并不是。AnyObject的存在是为了兼容现有的OC和IOS的代码,你并不会经常使用它来构建你自己的数据结构。Swift是强类型语言,并有类型推断的特性。AnyObject是一个指向对象的指针,也就是说它是一个类的实例,但它是一个指向未知类的指针。我们所需要关注的是在哪些场合来使用它,StroyBoard中会出现AnyObject,还有在某些函数的参数中见到AnyObject。

因为AnyObject是一种未知类型的指针,所以我们不能向它发送任何消息,为了使用它我们把它转换成一种我们知道的类型,我们唯一使用AnyObject的方法就是把它转化成我们知道的类。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

我们可以定义一个我们已知类型的变量,然后使用“变量 = AnyObject 转换后的东西”。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

这里有两种方式,一种叫做casting(转换),我们使用as进行强转。如果你不确定你强转的对象是不是你需要的类型,那么使用if -let结构加上as?来进行判断,这时as?会返回一个可选的结果。

你也可以使用更简单的语法 if A is B{...}

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

如果你遇到的是一个AnyObject类型的数组,我们会遇到这样的问题,这时IOS的一些遗留问题造成的,比如toolbarItems就是一个[AnyObject]类型的。我们要确认数组中的每个元素都是我们想要的类型,那么必须使用一个遍历,示例中提供了两种遍历方法。这里不能用as?因为在一个nil中做循环没意义,所以你最好确认你的数组中的元素是你想要的类型。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

另外一个例子是我们之前在storyboard中拖拽生成action的时候如果保留sender为AnyObject会怎么样呢?如示例所示我们使用as转换它也可以起到相同效果,但是繁琐的很,所以这就是为什么要保证如果是一个按钮触发了action那么sender的类型就一定要是一个UIButton的缘故了。假如有多个控件使用同一个action,那么需要判断sender的类型给出不同的做法,这时就需要sender的类型是AnyObject了。当然你可以这么做,然而这样的做法真的很罕见。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

另外一种情况,UIButton使用buttonWithType方法新建一个button对象的时候返回的其实是个AnyObject。下面就可以使用这种写法button as UIButton然后就可以使用UIButton的方法和属性了。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

casting(类型转换)并不仅限于AnyObject,你可以转换任意两个对象,对于非AnyObject的对象,需要在同一继承链上才能转换,并且只能沿着继承链向下转型。如例所示,定义一个UIviewController类型的,虽然使用了CalculatorViewCotroller的构造器,但是Swift默认它还是一个viewController,不会响应它的enter方法。

所以我们需要转型之后再调用方法。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions

下面来看一些Funtions(函数)

首先是数组中的一些函数。我们知道数组中可以使用+=,但是这个函数的右边需要是[T](我们又遇到泛型了),所以如果你要把一个东西加到数组中,那么把它放到中括号中,有些人会在这里犯错误直接去+=一个元素,要知道+=只能连接两个数组。

数组还有一些有趣的元素,first和last会返回数组第一个和最后一个元素,它们是可选型。

数组中的一些方法比如我们之前接触到的append、可选择插入位置的insert还有可以选择插入位置并且插入新数组的splice。

remove也有两个方法,删除一个元素和删除一个子数组。

另外还有replace方法,你可以选择被替换的元素区间,并且替换和被替换的元素个数不必相等,比如你把原来数组的三个元素替换成了6个,那么数组就变长了。

同时数组也有排序方法sort。排序方法接受一个函数作为参数,一个决定两个元素谁放在前面的函数,默认的是使用小于号的比较。通常会把排序函数写成一个闭包。例如a.sort{$0<$1},闭包会被不停地调用,它采用的是快排或者其他任意的排序方法。

【小弟我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记7 AnyObject、Functions


这里还有三个非常酷的方法:

filter方法可以将你不喜欢的元素过滤掉之后返回给你剩余的数组。

另外一个很酷的方法是mapping,这会将你原来数组中的元素映射到一个新的数组中,甚至新的数组的元素类型与原数组的类型都可以不一样,我可以把一个Int类型的映射成一个String类型的新数组。你可以看到示例中展示了Swift强大的闭包特性。

还有一个方法是reduce方法,可以把我们的数组变成一个元素,你需要指定一个初始值,示例中的初始值是第一个元素,然后在闭包中写一个reduce的规则,示例中是一个累加的规则,然后reduce方法就会开始组合、组合直到全部累加完成输出。