ios - Rimozione dall'array durante l'enumerazione in Swift?



arrays enumeration (6)

Consiglio di impostare gli elementi su zero durante l'enumerazione e dopo aver completato rimuovere tutti gli elementi vuoti utilizzando il metodo filter () array.

https://src-bin.com

Voglio enumerare un array in Swift e rimuovere alcuni elementi. Mi chiedo se questo è sicuro da fare e, in caso contrario, come dovrei farlo.

Attualmente, lo farei:

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

Answer #1

Il tradizionale ciclo per potrebbe essere sostituito con un semplice ciclo while, utile se è necessario eseguire anche alcune altre operazioni su ciascun elemento prima della rimozione.

 var index = array.count-1 while index >= 0 { let element = array[index] //any operations on element array.remove(at: index) index -= 1 } 

Answer #2

In Swift 2 questo è abbastanza facile usando enumerate e reverse .

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

Vedi la mia vasca idromassaggio qui: http://swiftstub.com/944024718/?v=beta


Answer #3

No, non è sicuro mutare le matrici durante l'enumarazione, il codice andrà in crash.

Se si desidera eliminare solo pochi oggetti, è possibile utilizzare la funzione filter .


Answer #4

Potresti considerare il modo filter :

var theStrings = ["foo", "bar", "zxy"]

// Filter only strings that begins with "b"
theStrings = theStrings.filter { $0.hasPrefix("b") }

Il parametro di filter è solo una chiusura che accetta un'istanza di tipo array (in questo caso String ) e restituisce un valore Bool . Quando il risultato è true , mantiene l'elemento, altrimenti l'elemento viene filtrato.


Answer #5

Quando un elemento in un determinato indice viene rimosso da un array, tutti gli elementi successivi avranno la loro posizione (e indice) cambiata, perché si spostano indietro di una posizione.

Quindi il modo migliore è di navigare nell'array in ordine inverso - e in questo caso suggerisco di usare un ciclo for tradizionale:

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

Tuttavia, a mio avviso, l'approccio migliore consiste nell'utilizzare il metodo di filter , come descritto da @perlfly nella sua risposta.





enumeration