Per comprendere il motivo per cui i
non può essere disattivato, è necessario sapere cosa è lo for…in
abbreviazione. for i in 0..<10
è espanso dal compilatore per il seguente:
var g = (0..<10).generate()
while let i = g.next() {
// use i
}
Ogni volta che tutto il ciclo, i
è una variabile appena dichiarata, il valore di scartare il risultato successivo di chiamare next
sul generatore.
Ora, che while
può essere scritto in questo modo:
while var i = g.next() {
// here you _can_ increment i:
if i == 5 { ++i }
}
ma, naturalmente, non servirebbe - g.next()
è ancora in corso per generare un 5 prossima volta intorno al ciclo. L'incremento nel corpo era inutile.
Presumibilmente per questo motivo, for…in
non supporta la stessa sintassi var
per la dichiarazione del suo contatore di loop - sarebbe molto confuso se non ti rendessi conto di come ha funzionato.
(a differenza di where
, dove è possibile vedere cosa sta succedendo, la funzionalità var
è occasionalmente utile, analogamente a quanto può essere func f(var i)
).
Se quello che vuoi è di saltare alcuni iterazioni del ciclo, la cosa migliore (senza ricorrere a C-style for
o while
) è quello di utilizzare un generatore che salta i valori rilevanti:
// 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)
}
Modifica del l'iteratore di un 'for' è solitamente considerato un codice errato. 'for in' non ha iteratore,' number' non è un iteratore. Il suo valore non influenza il loop in alcun modo. – Sulthan