美文网首页
深入Swift集合类型背后的协议,方法,扩展(二)

深入Swift集合类型背后的协议,方法,扩展(二)

作者: 子键_北京不眠夜 | 来源:发表于2016-07-21 19:01 被阅读16次

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

相关文章

网友评论

      本文标题:深入Swift集合类型背后的协议,方法,扩展(二)

      本文链接:https://www.haomeiwen.com/subject/kuwbjttx.html