Eliminando de la matriz durante la enumeración en Swift?

Quiero enumerar a través de una matriz en Swift, y eliminar ciertos elementos. Me pregunto si esto es seguro, y si no, cómo se supone que debo lograr esto.

Actualmente, estaría haciendo esto:

for (index, aString: String) in enumerate(array) { //Some of the strings... array.removeAtIndex(index) } 

En Swift 2 es bastante fácil usar enumerate y reverse .

 var a = [1,2,3,4,5,6] for (i,num) in a.enumerate().reverse() { a.removeAtIndex(i) } print(a) 

Mira mi swiftstub aquí: http://swiftstub.com/944024718/?v=beta

Puede considerar la posibilidad de filter :

 var theStrings = ["foo", "bar", "zxy"] // Filter only strings that begins with "b" theStrings = theStrings.filter { $0.hasPrefix("b") } 

El parámetro del filter es solo un cierre que toma una instancia de tipo array (en este caso, String ) y devuelve un Bool . Cuando el resultado es true , conserva el elemento; de lo contrario, el elemento se filtra.

Cuando se elimina un elemento en un índice determinado de una matriz, todos los elementos subsiguientes tendrán su position (y su índice) cambiados, ya que se desplazan hacia atrás en una position.

Entonces, la mejor manera es navegar por la matriz en order inverso, y en este caso sugiero usar un bucle tradicional para:

 for var index = array.count - 1; index >= 0; --index { if condition { array.removeAtIndex(index) } } 

Sin embargo, en mi opinión, el mejor enfoque es utilizar el método de filter , como lo describe @perlfly en su respuesta.

No, no es seguro mutar matrices durante la enumeración, su código se bloqueará.

Si desea eliminar solo algunos objects, puede usar la function de filter .

En Swift 3 , esto sería:

Con numbers, según la respuesta de Johnston:

 var a = [1,2,3,4,5,6] for (i,num) in a.enumerated().reversed() { a.remove(at: i) } print(a) 

Con cadenas como la pregunta del OP:

 var b = ["a", "b", "c", "d", "e", "f"] for (i,str) in b.enumerated().reversed() { if str == "c" { b.remove(at: i) } } print(b) 

Cree una matriz mutable para almacenar los elementos que se eliminarán y luego, después de la enumeración, elimine esos elementos del original. O bien, cree una copy de la matriz (inmutable), enumere eso y elimine los objects (no por índice) del original mientras enumera.

Recomiendo configurar elementos a nil durante la enumeración, y después de completar, elimine todos los elementos vacíos utilizando el método arrays filter ().