Swift的生成器和序列(1)

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(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结束。注意:我们这个例子是通过获取数组的下标来实现获取数组元素的,也可以直接获取数组元素。

你可能感兴趣的:(Swift的生成器和序列(1))