美文网首页
Swift 进阶笔记-业务化 Tips(2)-迭代器

Swift 进阶笔记-业务化 Tips(2)-迭代器

作者: wiiale | 来源:发表于2018-01-01 14:40 被阅读0次

Iterator

迭代器 Iterator 是从 Sequence 继承的类型,在遍历序列时管理遍历状态,Sequence 也通过迭代器访问元素。这次我们实现一个数组双向迭代器。

let numbers = [0, 1, 2, 3]
var _numIterator: BidirectionalIterator<[Int]>?
双向迭代器.gif

Demo:
https://github.com/wiiale/AdvancedSwiftThinker/tree/master/T02-Iterator-Bidirectional

实现双向迭代器

import Foundation

struct BidirectionalIterator<Elements> where Elements: BidirectionalCollection {
    let _elements: Elements
    var _position: Elements.Index
    
    init(elements: Elements) {
        self._elements = elements
        self._position = elements.startIndex
    }
    
    mutating func next() -> Elements.Element? {
        if _position == _elements.endIndex { return nil }
        let element = _elements[_position]
        _elements.formIndex(after: &_position)
        return element
    }
    
    mutating func previous() -> Elements.Element? {
        if _position == _elements.startIndex { return nil }
        _elements.formIndex(before: &_position)
        let element = _elements[_position]
        return element
    }
}

extension BidirectionalCollection {
    func makeBidirectionalIterator() -> BidirectionalIterator<Self> {
        return BidirectionalIterator(elements: self)
    }
}

与必须实现的next()方法一样,制造previous()方法实现双向。其中 _position 记录 Index,要注意在不返回 nil 的情况下,next 操作时先取后增 _position,previous 操作时先减 _position 后取值。

使用

let numbers = [0, 1, 2, 3]
var it = numbers.makeBidirectionalIterator()

it.next()        // 0
it.next()        // 1
it.next()        // 2
it.next()        // 3
it.next()        // nil
it.next()        // nil 

it.previous()    // 3
it.previous()    // 2
it.previous()    // 1
it.previous()    // 0
it.previous()    // nil
it.previous()    // nil

it.next()        // 0

文章Demo 汇总:
https://github.com/wiiale/AdvancedSwiftThinker

本册文集中以“提出简单需求->简单实现需求片段”为流程,内容只针对该知识点实现的业务实例进行熟悉,业务也必定存在比文章方法更好的实现方式,文章旨在分析知识点并加深理解。文集不普及基本知识,不包含《Swift 进阶》书籍的详细内容。深入学习Swift请大家支持正版书籍(ObjC 中国)

相关文章

网友评论

      本文标题:Swift 进阶笔记-业务化 Tips(2)-迭代器

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