Iterator
迭代器 Iterator 是从 Sequence 继承的类型,在遍历序列时管理遍历状态,Sequence 也通过迭代器访问元素。这次我们实现一个数组双向迭代器。
let numbers = [0, 1, 2, 3]
var _numIterator: BidirectionalIterator<[Int]>?

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