Um zu verstehen, warum i
nicht veränderbar sein kann, muss man wissen, was for…in
abgekürzt ist. for i in 0..<10
wird vom Compiler die folgenden erweitert:
var g = (0..<10).generate()
while let i = g.next() {
// use i
}
Jedes Mal, um die Schleife, i
eine frisch deklarierte Variable ist, wird der Wert von der nächsten Folge Abwickeln next
am Generator aufrufen.
Nun, die while
kann wie folgt geschrieben werden:
while var i = g.next() {
// here you _can_ increment i:
if i == 5 { ++i }
}
aber natürlich wäre es nicht helfen - g.next()
ist immer noch ein 5 beim nächsten Mal um die Schleife zu erzeugen gehen. Der Zuwachs im Körper war sinnlos.
Vermutlich aus diesem Grund unterstützt for…in
nicht die gleiche var
Syntax für die Deklaration seiner Schleife Zähler - es wäre sehr verwirrend, wenn Sie nicht wissen, wie es funktioniert.
(im Gegensatz zu where
, wo Sie sehen können, was passiert - die var
Funktionalität ist gelegentlich nützlich, ähnlich wie func f(var i)
sein kann).
Wenn das, was Sie wollen, ist sicher Iterationen der Schleife zu überspringen, Ihre bessere Wette (ohne for
oder while
bis C-Stil Zuflucht) ist, einen Generator zu verwenden, die die entsprechenden Werte überspringt:
// 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)
}
das Ändern Iterator eines 'for' wird normalerweise als schlechter Code angesehen. 'for in' hat keinen Iterator,' number' ist kein Iterator. Sein Wert beeinflusst die Schleife in keiner Weise. – Sulthan