Array是我们最常用的集合类了,Array的遍历也是很常用的操作。有没有想过语言底层是怎样实现遍历这个操作的呢。在OC中我们可以使用for循环直接用数组下标来访问,但是在swift中已经废弃了这种方式,而是用for in 来实现这个操作。for in这种方式的遍历是针对SequenceType这个protocol的,Array之所以支持for in就是因为它实现了SequenceType这个protocol。要说SequenceType就离不开GeneratorType这个protocol,它是SequenceType的基础。
先看GeneratorType的定义:(swift 3.0已经更名为IteratorProtocol)
public protocol IteratorProtocol {
associatedtype Element
public mutating func next() -> Self.Element?
}
这个协议由一个关联类型Element和一个next方法组成。Element表明这个协议会生成一个什么类型的值,next方法则是生成这个值的过程。下面我们通过一段代码说明这个protocol怎么工作。
class ReverseIterator:IteratorProtocol{
var element:Int
init<T>(array:[T]) {
self.element = array.count-1
}
func next() ->Int?{
let result:Int? = self.element < 0 ? nil : element
element -= 1
return result
}
}
let arr = ["A","B","C","D","E"]
let itertator = ReverseIterator(array:arr)
while let i = itertator.next(){
print("element \(i) of the array is \(arr[i])")
}
我们定义了一个ReverseIterator类实现IteratorProtocol协议。通过next方法,我们实现了一个倒序遍历一个数组。创建ReverseIterator对象的时候,需要一个Array做参数,然后我们通过while循环遍历数组,遍历的时候循环获取ReverseIterator对象的next方法直到返回nil结束。注意:我们这个例子是通过获取数组的下标来实现获取数组元素的,也可以直接获取数组元素。