集合(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的,否则怎么知道某个位置上的元素已经被访问过了呢。