¿Cómo escribo un for-loop en Swift 3 para una matriz que modifico durante el ciclo for?

Entonces, tengo un bucle for que se parece a esto:

for var i = 0; i < results.count ; i += 1 { if (results[i] < 5) { results.removeAtIndex(i) i -= 1 } } 

Esto solía funcionar. Pero cuando lo cambié a la syntax Swift 3.0 preferida:

 for var i in 0..<results.count { if (results[i] < 5) { results.removeAtIndex(i) i -= 1 } } 

Obtengo una exception IOOBE de matriz porque no vuelve a verificar el conteo y continúa hasta los results.count originales.

¿Cómo puedo solucionar esto? Funciona ahora, pero no quiero meterme en problemas en el futuro.

Si bien la solución que hace uso del filter es una buena solución y es más rápida , hay otra manera, si hacer uso de for-in es, sin embargo, todavía deseada:

 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) 

Resultado:

 [5, 6, 7, 8, 9, 10] 

Podríamos omitir esta línea i -= 1 total, además.

El problema con removeAtIndex dentro del bucle es que no hará que la matriz se vuelva a indexar en el lugar y, por lo tanto, provoque una exception fuera de límites de la matriz debido a que el count no se actualiza.

Al recorrer hacia atrás, la exception fuera de límites se puede evitar.

¿Podrías usar un filter lugar?

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

Si desea continuar usando for loop, puede enumerar sobre el índice y el elemento utilizando enumerate :

 for (index, element) in results.enumerate() { if (element < 5) { results.removeAtIndex(index) } } 

Aunque dependiendo de lo que esté haciendo en su ciclo, el método de filter podría ser una mejor idea.

Si tu ciclo avanza …

 for var i in (0..<results.count) where results.indices.contains(i) { //if the index doesn't exist, the loop will be stopped. if (results[i] < 5) { results.removeAtIndex(i) } }