Aby zrozumieć, dlaczego i
nie można zmienić, trzeba wiedzieć, co jest skrócone do for…in
. for i in 0..<10
jest rozszerzany przez kompilator do następujących:
var g = (0..<10).generate()
while let i = g.next() {
// use i
}
każdym razem wokół pętli i
jest świeżo zadeklarowana zmienna, wartość rozpakowaniu następny wynik z wywołaniem next
na generatorze.
teraz, że while
może być napisane tak:
while var i = g.next() {
// here you _can_ increment i:
if i == 5 { ++i }
}
ale oczywiście to nie pomoże - g.next()
nadal będzie generować 5 następnym razem wokół pętli. Wzrost w ciele był bezcelowy.
Prawdopodobnie z tego powodu nie obsługuje tej samej składni var
dla deklarowania licznika pętli - byłoby bardzo mylące, gdybyś nie wiedział, jak to działa.
(w przeciwieństwie do where
, gdzie można zobaczyć, co się dzieje - funkcjonalność var
jest czasami przydatna, podobnie jak może być func f(var i)
).
Jeśli to, co chcesz, aby pominąć pewne iteracji pętli, twój lepiej zakładu (bez uciekania się do C-stylu for
lub while
) jest użycie generatora że pomija istotne wartości:
// iterate over every other integer
for i in 0.stride(to: 10, by: 2) { print(i) }
// skip a specific number
for i in (0..<10).filter({ $0 != 5 }) { print(i) }
let a = ["one","two","three","four"]
// ok so this one’s a bit convoluted...
let everyOther = a.enumerate().filter { $0.0 % 2 == 0 }.map { $0.1 }.lazy
for s in everyOther {
print(s)
}
modyfikowania iterator 'for' jest zwykle uważany za zły kod. 'for in' nie ma iteratora,' number' nie jest iteratorem. Jego wartość w żaden sposób nie wpływa na pętlę. – Sulthan