How do I write a for-loop in Swift 3 for an array that I modify during the for loop? How do I write a for-loop in Swift 3 for an array that I modify during the for loop? ios ios

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.


Could you use a filter instead?

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]let greaterThan5 = numbers.filter{$0 >= 5}print(greaterThan5)


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.