集合(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的,否則怎么知道某個位置上的元素已經被訪問過了呢。