How do I write a for-loop in Swift 3 for an array that I modify during the for loop?
While the solution making use of filter
is a fine solution and it's more Swift-ly, there is another way, if making use of for-in
is, nonetheless, still desired:
var results = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]for var i in (0..<results.count).reverse(){ if (results[i] < 5) { results.removeAtIndex(i) //i -= 1 }}print(results)
Result:
[5, 6, 7, 8, 9, 10]
We could omit this line i -= 1
altogether, in addition.
The problem with removeAtIndex
within the loop is that it will not cause the array to re-index itself in-place and thus causing an array out of bounds exception due to count
not being updated.
By traversing backwards, the out of bounds exception can thus be avoided.
If you want to continue using a for
-loop, you can enumerate over both index and element using enumerate
:
for (index, element) in results.enumerate() { if (element < 5) { results.removeAtIndex(index) }}
Although depending on what you're doing in your loop, the filter
method might be a better idea.