Я ищу итератор для бесконечной итерации коллекции в режиме цикла. Чтобы достигнуть конечного индекса коллекции, итератор должен вернуть элемент в начальный индекс.Пользовательский итератор для бесконечной итерации коллекции в режиме цикла
Следующее решение кажется работающим, но я надеюсь, что оно может быть сделано лучше.
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())
}
Правильно ли это сделать пользовательский итератор? Что можно улучшить?
Спасибо!
Для дальнейшего использования вопросы об улучшении рабочего кода, вероятно, лучше подходят для обмена курсором ** Code Review **. http://codereview.stackexchange.com/ –
IMO, codereview.se лучше всего подходит для обзора кода, который сам по себе будет иметь мало общего интереса и вряд ли будет искать явно (т. е. представляют интерес лучшие методы, а не код). Этот вопрос относится к обычно интересному фрагменту кода, касающемуся конкретно интересующей темы (правильное использование индексов Swift 3) и, вероятно, будет искать в будущем. Если бы плакат не включал код, они, несомненно, получили бы «Что вы пробовали?» Комментарии. Если они включают код, представляется несправедливым перенаправить их на codereview. –