3
我正在尋找迭代器以循環模式無限迭代集合。所以當集合的結束索引達到時,迭代器應該在開始索引處返回元素。自定義迭代器以循環模式無限迭代集合
下面的解決方案似乎有效,但我希望可以以更好的方式進行。
public struct LoopIterator<T: Collection>: IteratorProtocol {
private let collection: T
private var startIndexOffset: T.IndexDistance
public init(collection: T) {
self.collection = collection
startIndexOffset = 0
}
public mutating func next() -> T.Iterator.Element? {
guard !collection.isEmpty else {
return nil
}
let index = collection.index(collection.startIndex, offsetBy: startIndexOffset)
startIndexOffset += T.IndexDistance(1)
if startIndexOffset >= collection.count {
startIndexOffset = 0
}
return collection[index]
}
}
extension Array {
func makeLoopIterator() -> LoopIterator<Array> {
return LoopIterator(collection: self)
}
}
// Testing...
// Will print: 1, 2, 3, 1, 2, 3
var it = [1, 2, 3].makeLoopIterator()
for _ in 0..<6 {
print(it.next())
}
這是做自定義迭代器的正確方法嗎?有什麼可以改進的?
謝謝!
爲了將來的參考,有關工作代碼改進的問題可能更適合**代碼審查**堆棧交換。 http://codereview.stackexchange.com/ –
國際海事組織,codereview.se是最適合審查代碼本身將是一般興趣不大,不可能明確搜索(即最佳做法是有趣的,而不是代碼)。這個問題是關於一個普遍有趣的代碼,特別涉及廣泛關注的主題(正確使用Swift 3索引),並且可能在將來進行搜索。如果海報不包括代碼,他們肯定會收到「你試過了什麼?」註釋。如果它們包含代碼,將它們重定向到codereview似乎是不公平的。 –