swift标准库中为我们提供了三种类型的集合。八条8tiao 现在写一份非官方文档,把这些协议的作用以及之间的关系总结出来。方便大家将来深入学习集合的时候做参考。我们现在看一下Array、Dictionary、Set三种集合的定义形式(非完整定义)。
// Array的定义
public struct Array<Element> : CollectionType, MutableCollectionType {}
extension Array : _ArrayType {}
public protocol _ArrayType : RangeReplaceableCollectionType, MutableSliceable, ArrayLiteralConvertible {}
// Dictionary的定义
public struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible {}
// Set的定义
public struct Set<Element : Hashable> : Hashable, CollectionType, ArrayLiteralConvertible {}
// CollectionType的定义
public protocol CollectionType : Indexable, SequenceType {}
当前的整理是基于swift2.2,在swift3当中对协议做了调整,例如用MutableCollectionType协议替代了MutableSliceable协议,在下面我们会提到。
如果你现在还不了解genernator,sequence。可以看另外一篇内容了解Generators VS Sequences VS Collections
一、二、三、四、五上山打老虎,我们现在就开始扒一扒这些协议的作用。
所有的集合都一定准守 CollectionType 协议(否则就不是集合类型啦),而CollectionType继承了
SequenceType协议,所以,我们从这从它开始吧。
SequenceType协议
我们经常在集合类型对象上面使用的map()、filter()等方法它们其实就是来自于SequenceType协议
只要我们准守了SequenceType协议,我们可以默认获得下面这些方法,而且是协议提供的默认实现,不需要我们自己动手哦,是不是相当划算?
- contains
- enumerat
- filter
- join
- lazy
- map
- maxElement
- minElement
- reduce
- sorted
- startsWith
- underestimateCount
- zip
CollectionType / MutableCollectionType
MutableCollectionType协议和CollectionType协议的区别在于,MutableCollectionType协议的下标方法中提供了set方法,so,mutable!!!!!如果我们实现CollectionType协议,那我们需要提供两个属性 startIndex 和 endIndex,并且提供一个下标方法 subscript()用来返回数组下标对应的元素。实现一个CollectionType协议的好处也是多多滴,我们可以获得如下方法。
- count
- find
- first
- indices
- isEmpty
- last
- partition
- reverse
- sort
这些方法都太熟悉了吧,其实它们就是属于CollectionType协议的,而且协议也我们提供了默认实现!!!
MutableSliceable
我们经常需要在数组上面截取一部分数据(dropLast方法就意味着截取不包括最后一个元素的片段),截取后获得的是slice类型的对象,slice类型的对象和原数组共享indices属性,并且共享同一段内存空间,就像视图的性质那样,但一旦发生数据变化,那么双方就会分别获得自己独立的存储空间。
虽然swift3将会把MutableSliceable协议去掉,但它的所提供的能力并没有去掉,而是使用MutableCollectionType进行了替代。如果我们实现了MutableSliceable协议,我们会获得一下方法。
- dropFirst
- dropLast
- prefix
- split
- suffix
RangeReplaceableCollectionType
我们使用数组的时候,总是需要对数组进行管理操作的吧,比方说增、删、改数组的内部元素。定义这些任务就是RangeReplaceableCollectionType协议存在的价值,如果我们准守了RangeReplaceableCollectionType协议,那么我们将会获得以下管理数组的方法。
- extend
- insert
- removeAll
- removeLast
- removeRange
- splice
内容中的方法都没有提供说明,一个是考虑官方文档中有详细说明,另外一个考虑都是常用的方法。本文主要是给集合的最基本协议和方法进行归类总结。