Swift中如何实现每次遍历集合中的三个元素?
实现Sequence的三元组分块遍历
可以通过扩展Sequence协议,实现一个triples()方法,完成每次遍历三个元素的需求,不足三个的位置用nil填充:
public extension Sequence { func triples() -> AnyIterator<(Element, Element?, Element?)> { return AnyIterator(sequence(state: makeIterator(), next: { iterator in guard let first = iterator.next() else { return nil } let second = iterator.next() let third = iterator.next() return (first, second, third) })) } }
代码说明
- 利用
sequence(state:next:)维护迭代器的状态,保证遍历的连续性 - 先尝试取出第一个元素,若不存在则终止迭代
- 依次尝试取出第二个、第三个元素,元素不足时自动用
nil填充 - 通过
AnyIterator包装,返回符合需求的迭代器
使用示例
let array = [1, 2, 3, 4, 5, 7, 8, 9, 10] let tripleArray = Array(array.triples()) print(tripleArray) // 输出结果:[(1, Optional(2), Optional(3)), (4, Optional(5), Optional(7)), (8, Optional(9), Optional(10))]
注:你期望输出中的
(4, 5, 6)应为笔误,原数组中无元素6,实际会返回(4, Optional(5), Optional(7))
内容的提问来源于stack exchange,提问作者Jayaseelan Kumarasamy
相关产品推荐
相关产品推荐

