В общем, итератор - это не то, что вы можете сказать for...in
; это причина, почему вы можете сказать for...in
чему-то другому. Под капотом for...in
на самом деле находится while
l oop, который многократно вызывает next
на итераторе. Теперь, когда вы посмотрели за кулисы, вы тоже должны это использовать.
Так, например, допустим, у нас есть словарь
let d = [1:"hey", 2:"ho"]
Тогда это:
for (i,s) in d {
print(i, s)
}
эквивалентно этому:
var it = d.makeIterator()
while let (i,s) = it.next() {
print(i,s)
}
И фактически под капотом первый является вторым. Существуют ситуации, когда заставить oop вести себя так, как вы хотите, может быть проще, если вы «развернете» for...in
в форму итератора.
Теперь, в конкретном случае массива, который индексируется число, итератор является IndexingIterator, который сам имеет итератор - который сам имеет итератор и так далее. Это черепахи до самого конца, до тошноты:
let arr = [1,2,3]
let whoa = arr.makeIterator().makeIterator().makeIterator() // !!!!
for i in whoa {
print(i)
}
Вы можете продолжать это определение whoa
сколько угодно.