Swift标准库源码之旅 -其它集合协议
2020-10-09 本文已影响0人
Zafir_zzf
BidirectionalCollection
A collection that supports backward as well as forward traversal.
一种支持使用索引进行向后遍历的集合,当然也支持向前遍历
在Collection
协议里只要求实现索引如何向前移动
func index(after i: Index) -> Index
func formIndex(after i: inout Index)
我们如果想要取此集合的最后一个值那只能是从头遍历到尾.有一些数据结构确实也只支持这样的形式.
如果要想支持双向遍历需要另外实现以下方法
func index(before i: Index) -> Index
支持反向遍历会给我们带来什么好处呢
- 常量级时间复杂度的
var last: Element?
- 通过
reversed
方法得到一个遍历行为逆序的新集合ReversedCollection
话说, 我们取一个集合的最后一个元素直接使用endIndex - 1
不就可以了吗? 针对索引类型Index为Int的可以这样做, 但是对于字典/Set/String这三种常用的集合类型其实Index
类型都不是Int
. 而Index
类型如果是Int
就可以说明集合是支持随机访问的了.这是RandomAccessCollection
协议所定义的能力.