Swift 中的循环迭代器

Cycle iterator in Swift

在 Python 中有 itertools.cycle,它接受一个 iterable 并生成一个可迭代的迭代器,该迭代器重复从源中产生内容。

我想在 Swift 中复制此行为。

复制此行为的候选者是标准库的 repeatElement(_:count:):执行 repeatElement(seq, count: 5).flatMap({[=14=]}) 会创建一个包含 seq 元素的数组五次,但这不符合我的要求因为它只重复 seq 有限次。此外,它创建了一个长度为 5 * seq.lengthArray,实际上只需要一个长度为 seq 的缓存。

所以问题是:如何通过重复源 Sequence 的元素来创建无限 Sequence?该解决方案的 space 成本不应超过 O(n)。 (O(1) 在 Swift 中不可能得到保证,因为 Sequence makes no guarentee that it can be iterated multiple times。)

手动实现一个 Sequence 有什么问题?只要小心一点,您的索引就永远不会溢出,您可以随意循环。

请注意,API 文档警告读起来更像是一个友好的提醒,即重用不是 Sequence 接口契约的强制性部分。但这并不排除您的特定实现可在多个循环之间重用。