Swift 中的循环迭代器
Cycle iterator in Swift
在 Python 中有 itertools.cycle
,它接受一个 iterable
并生成一个可迭代的迭代器,该迭代器重复从源中产生内容。
我想在 Swift 中复制此行为。
复制此行为的候选者是标准库的 repeatElement(_:count:)
:执行 repeatElement(seq, count: 5).flatMap({[=14=]})
会创建一个包含 seq
元素的数组五次,但这不符合我的要求因为它只重复 seq
有限次。此外,它创建了一个长度为 5 * seq.length
的 Array
,实际上只需要一个长度为 seq
的缓存。
所以问题是:如何通过重复源 Sequence
的元素来创建无限 Sequence
?该解决方案的 space 成本不应超过 O(n)
。 (O(1)
在 Swift 中不可能得到保证,因为 Sequence
makes no guarentee that it can be iterated multiple times。)
手动实现一个 Sequence
有什么问题?只要小心一点,您的索引就永远不会溢出,您可以随意循环。
请注意,API 文档警告读起来更像是一个友好的提醒,即重用不是 Sequence
接口契约的强制性部分。但这并不排除您的特定实现可在多个循环之间重用。
在 Python 中有 itertools.cycle
,它接受一个 iterable
并生成一个可迭代的迭代器,该迭代器重复从源中产生内容。
我想在 Swift 中复制此行为。
复制此行为的候选者是标准库的 repeatElement(_:count:)
:执行 repeatElement(seq, count: 5).flatMap({[=14=]})
会创建一个包含 seq
元素的数组五次,但这不符合我的要求因为它只重复 seq
有限次。此外,它创建了一个长度为 5 * seq.length
的 Array
,实际上只需要一个长度为 seq
的缓存。
所以问题是:如何通过重复源 Sequence
的元素来创建无限 Sequence
?该解决方案的 space 成本不应超过 O(n)
。 (O(1)
在 Swift 中不可能得到保证,因为 Sequence
makes no guarentee that it can be iterated multiple times。)
手动实现一个 Sequence
有什么问题?只要小心一点,您的索引就永远不会溢出,您可以随意循环。
请注意,API 文档警告读起来更像是一个友好的提醒,即重用不是 Sequence
接口契约的强制性部分。但这并不排除您的特定实现可在多个循环之间重用。