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
內容中的方法都沒有提供說明,一個是考慮官方文檔中有詳細說明,另外一個考慮都是常用的方法。本文主要是給集合的最基本協議和方法進行歸類總結。