深入Swift集合類型背后的協議,方法,擴展(二)

轉自bestswifter

集合(Collection)

對比一下現有的Sequence和數組,會發現它還欠缺一個特性——下標。

回顧一下Generator和Sequence,它們只是實現了集合的遍歷,但沒有指定怎么遍歷。也就是說,只要Generator設計“得當”,即使是1和2這兩個元素,我們也可以不斷遍歷:“1的next是2,2的next是1”。這種情況顯然不符合我們對數組的認識。歸根結底,還是Sequence中無法確定元素的位置,也就無法確保不遍歷到已經訪問過的元素。

基于這種考慮,我們抽象出集合(Collection)的概念。在集合中,每個元素都有確切的位置,因此集合有明確的開始位置和結束位置。給定一個位置,就可以找到這個位置上的元素。Collection在Sequence的基礎上實現了Indexable協議

public protocol CollectionType : Indexable, SequenceType {
     public var startIndex: Self.Index { get }
     public var endIndex: Self.Index { get }
     public subscript (position: Self.Index) -> Self._Element { get }
}
下標(Index)

雖然我們在使用數組的時候,元素下標總是從0開始,并且逐個遞增。但下標不必是從0開始遞增的整數。比如a、b、c……也可以作為下標。下標類型的關鍵在于能根據某一個下標推斷出下一個下標是什么,比如對于整數來說下一個下標就是當前下標值加1。下標類型的協議如下:

public protocol ForwardIndexType : _Incrementable {
     ///....
 }  

 public protocol _Incrementable : Equatable {
     public func successor() -> Self
 }

對于下標類型來說,它們必須實現successor()方法,同時也得是Equatable的,否則怎么知道某個位置上的元素已經被訪問過了呢。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容