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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容