我以前需要这个,并实施(我想说的是)一个非常好的解决方案。 CycleSequence 将任何类型的 Collection 包装成一个新的 inifite Sequence,它发出这些元素,永远循环。然后您可以使用.prefix(n) 获取第一个n 元素:
struct CycleSequence<C: Collection>: Sequence {
let cycledElements: C
init(cycling cycledElements: C) {
self.cycledElements = cycledElements
}
public func makeIterator() -> CycleIterator<C> {
return CycleIterator(cycling: cycledElements)
}
}
struct CycleIterator<C: Collection>: IteratorProtocol {
let cycledElements: C
var cycledElementIterator: C.Iterator
init(cycling cycledElements: C) {
self.cycledElements = cycledElements
self.cycledElementIterator = cycledElements.makeIterator()
}
public mutating func next() -> C.Iterator.Element? {
if let next = cycledElementIterator.next() {
return next
} else {
self.cycledElementIterator = cycledElements.makeIterator() // Cycle back again
return cycledElementIterator.next()
}
}
}
print(Array(CycleSequence(cycling: [true, false]).prefix(7)))
print(Array(CycleSequence(cycling: 1...3).prefix(7)))
print(Array(CycleSequence(cycling: "ABC").prefix(7)))
print(Array(CycleSequence(cycling: EmptyCollection<Int>()).prefix(7)))
print(Array(zip(1...10, CycleSequence(cycling: "ABC"))))
输出:
[true, false, true, false, true, false, true]
[1, 2, 3, 1, 2, 3, 1]
["A", "B", "C", "A", "B", "C", "A"]
[]
[(1, "A"), (2, "B"), (3, "C"), (4, "A"), (5, "B"), (6, "C"), (7, "A"), (8, "B"), (9, "C"), (10, "A")]