Swift的生成器和序列(1)

作者: 铁围山 | 来源:发表于2016-10-19 14:04 被阅读612次

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

    相关文章

      网友评论

        本文标题:Swift的生成器和序列(1)

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