购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

Tip 10

下标

下标相信大家都很熟悉了,在绝大多数语言中使用下标来读写类似数组和字典等数据结构的做法,似乎已经是业界标准。在Swift中,Array和Dictionary当然也实现了下标读写:

对数组没有什么好说的,但是对字典需要注意,我们通过下标访问得到的结果是一个Optional的值。这是很容易理解的,因为你不能限制下标访问时的输入值,对于数组来说,如果越界了就直接给你“脸色”,让你崩溃,但是对于字典,查询不到是很正常的一件事情。对此,在Swift中我们有更好的处理方式,那就是返回nil告诉你没有你要找的东西。

作为一门代表了先进生产力的语言,Swift是允许我们自定义下标的。我们不仅能对自己写的类型自定义下标,也能对那些已经支持下标访问的类型(没错,就是Array和Dictionay)进行扩展。我们重点来看看向已有类型添加下标访问的情况吧,比如说Array,我们很容易就可以在Swift的定义文件(在Xcode中按住Cmd键,并单击任意一个Swift内建的类型或者函数就可以访问到)里,找到Array已经支持的下标访问类型:

它们共有两种,分别接受单个Int类型的序号和一个表明范围的Range<Int>,作为对应,返回值也分别是单个元素和一组对应输入返回的元素。

于是我们发现一个挺让人郁闷的问题,那就是我们很难一次性取出某几个特定位置的元素,比如在一个数组内,当我们想取出index为0、2、3的元素的时候,在现有的体系下就会比较吃力。我们很可能要去枚举数组,然后在循环里判断它们是否我们想要的。其实这里有更好的做法,比如说可以实现一个接受数组作为下标输入的读取方法:

这样,我们的Array的灵活性就大大增强了:

练习

虽然我们在这里实现了下标为数组的版本,但是我并不推荐使用这样的形式。如果阅读过参数列表(见第35页)的读者也许会想为什么在这里我们不使用看起来更优雅的参数列表的方式,也就是subscript(input:Int...)的形式。不论从易用性还是可读性上来说,参数列表的形式会更好。但是存在一个问题,那就是在只有一个输入参数的时候参数列表会导致和现有的定义冲突,有兴趣的读者不妨试试看。当然,我们完全可以使用至少两个参数的的参数列表形式来避免这个冲突,即定义形如subscript(first:Int,second:Int,others:Int...)的下标方法,我想这作为练习留给读者进行尝试会更好。 Xwy/mbRueODjTGO76ijKcv7QawHAMAonLs6omBMU3SjHiWCWOOOu3IFkubZpqNLl

点击中间区域
呼出菜单
上一章
目录
下一章
×