Swift: elimina tutti gli elementi dell'array


108

Sto cercando di eliminare tutti gli elementi dell'array con un ciclo for come questo:

for index 1...myArray.count {
   myArray.removeAtIndex(index)
}

Ma non funziona, ottengo questo errore prima di costruire:

Previsto ';' nell'istruzione "for"


5
Semplice. reinizializza l'array ...
VJ

Risposte:


326

C'è un metodo (in realtà una funzione)

myArray.removeAll()

1
Non lo sapevo, grazie +1
JamesG

11
@NoodleOfDeath Gli array Swift, rigorosamente detti, sono se gli structstruct hanno a functionsdifferenza delle classi che hanno methods.
vadian

1
@vadian +1 per il chiarimento. Ho dimenticato Arrayche sono structs.
Coder

1
hai bisogno di chiamare la funzione removeAll () quando esci da una vista (viewcontroller) dove lo hai inizializzato, o va via da solo !?
Famic Tech

1
@FamicTech Dipende: se la vista viene scaricata scompare implicitamente, se la vista scompare devi solo chiamare removeAll(). Tuttavia è buona pratica (disciplina della memoria) rimuovere tutti i dati non necessari quando una vista scompare.
vadian

17

Dando per scontato che la risposta di @vadian sia la soluzione , vorrei solo far notare che il tuo codice non funziona.

Prima di tutto, gli indici degli array sono basati su 0, quindi dovresti riscrivere l'intervallo di conseguenza:

for index 0..<myArray.count {
   myArray.removeAtIndex(index)
}

Tuttavia, questa implementazione causerà un arresto anomalo. Se hai un array di 10 elementi, l'ultimo elemento occupa la posizione nell'indice 9.

Usando quel ciclo, alla prima iterazione l'elemento all'indice 0 viene rimosso e questo fa sì che l'ultimo elemento si sposti verso il basso all'indice 8.

Alla successiva iterazione, l'elemento all'indice 1 viene rimosso e l'ultimo elemento si sposta all'indice 7. E così via.

Ad un certo punto del ciclo, un tentativo di rimuovere un elemento per un indice inesistente provocherà l'arresto anomalo dell'app.

Quando si rimuovono elementi da un array in un ciclo, il modo migliore per farlo è attraversarlo in ordine inverso:

for index in reverse(0..<myArray.count) {
    myArray.removeAtIndex(index)
}

Ciò garantisce che gli elementi rimossi non modificano l'ordine o l'indice degli elementi ancora da elaborare.


1
C'è una funzione per rimuovere tutti gli elementi in una sola riga. come risposta di @ vadian ...
VJ

3
@VJ è quello che ho scritto nella prima riga della mia risposta :)
Antonio

+1 per una soluzione che può essere utilizzata per rimuovere una particolare istanza di un oggetto. Uso public extension Array where Element : Equatable { public mutating func remove(element: Element) -> Int { var occurrences = 0; for index in (0 ..< count).reverse() { if self[index] == element { removeAtIndex(index); occurrences += 1 } }; return occurrences } }preferibilmente non tutta una riga ma quel codice dovrebbe essere compilato su una riga
NoodleOfDeath

Perché no for _ in 0...<myArray.count { myArray.removeAtIndex(0) }? Non so ancora molto sull'efficienza, ma in questo modo non è necessario invertire la gamma, quindi forse è più veloce.
cbjeukendrup

Funziona anche questo! Stesso metodo in termini di efficienza, rimuovi dall'inizio invece che alla fine, ma salvi una variabile :-)
Antonio

7

Ti manca la inparola chiave che causa il tuo errore. Il codice dovrebbe essere:

for index in 1...myArray.count {
    myArray.removeAtIndex(index)
}

Tuttavia, questo non funzionerà come ti aspetteresti per un paio di motivi:

  • L'ultimo indice valido è count - 1che richiederebbe1..<myArray.count
  • Ancora più importante, la rimozione di un elemento da un array lo accorcia cambiando ogni volta gli indici.

Se stai cercando di rimuovere tutte le cose dall'array, dovresti fare come altri hanno suggerito e usare:

myArray.removeAll()

Nel caso in cui desideri solo il primo elemento e nient'altro, potresti ottenere un riferimento al primo oggetto, svuotare l'array, quindi aggiungere nuovamente l'oggetto:

var firstElement = myArray.first!
myArray.removeAll()
myArray.append(firstElement)

Scusa se non ho visto "in" ... Fatto +1
VJ

1
(+1) per spiegare l'errore effettivo. (-1) perché questo non funzionerà, poiché l'eliminazione di un elemento rende l'array più corto. (Nota anche che l' ultimo indice valido è count - 1).
Martin R

7

Se vuoi veramente cancellare l'array, il modo più semplice è reinizializzarlo.


3

Il tuo codice dovrebbe funzionare, è appena fuori limite.

Swift 3

existingArray = []

In questo modo si riassegna un array vuoto all'array esistente e si fa riferimento al tipo di dati.

In alternativa, è possibile utilizzare removeAllche rimuove tutti gli elementi dall'array e fornisce un'opzione per mantenere la capacità esistente.

existingArray.removeAll()

Questa è una mutatingfunzione che significa che l'array che chiama il metodo verrà cambiato (vuoto).


2

Kyle è sulla strada giusta, ma il suo codice fallirà poiché i possibili indici si riducono durante l'enumerazione, portando a indici illegali.

Un modo per risolverlo è enumerare all'indietro. In modo rapido questo viene fatto usando i passi .

for index in stride(from: myArray.count - 1, through: 0, by: -1) {
    myArray.removeAtIndex(index)
}

un'altra opzione sarebbe quella di utilizzare filter()

Swift 1.2

myArray = filter(myArray, { (obj) -> Bool in
    return false
})

Swift 2

myArray = myArray.filter{ (obj) -> Bool in
    return false
}

Molto interessante! Non sapevostride
Kyle Decot

1

È disponibile il metodo removeAllObjects () in Swift 2

Syntax :  public func removeAllObjects()
Eg.:   mainArray.removeAllObjects

Per rimuovere un elemento in un particolare indice utilizzare:

Syntax : public func removeObjectAtIndex(index: Int)
Eg.: mainArray.removeObjectAtIndex(5)

Per rimuovere l'ultimo elemento utilizzare:

Syntax : public func removeLastObject()
Eg.: mainArray.removeLastObject()

Per rimuovere elementi in una gamma particolare utilizzare:

Syntax : public func removeObject(anObject: AnyObject, inRange range: NSRange)

Per rimuovere un particolare elemento utilizzare:

Syntax : public func removeObject(anObject: AnyObject)

La schermata sottostante mostra l'elenco dei metodi disponibili nell'estensione NSMutableArray

Screenshot 1


0

Puoi anche farlo:

for _ in myArray
{
    myArray.removeAtIndex(0)
}

2
Questa soluzione è terribilmente inefficiente: ad ogni iterazione tutti gli indici degli oggetti successivi vengono spostati. Inoltre, non sono sicuro che questa implementazione sia sicura. Almeno nelle raccolte Objective-C è vietata la mutazione durante l'enumerazione.
Borys Verebskyi

0

Per rimuovere tutti i dati da un array

yourArrayData.removeAll()


0

Vadian ha la risposta corretta in termini di ciò che stai cercando di ottenere. Il problema mostrato come risultato dell'esempio di codice è dovuto al modo in cui stai tentando di creare il forciclo. Indexinizierà da 0 per impostazione predefinita. L'aggiunta di un intervallo di numeri dopo non è il modo corretto per creare un ciclo for. Ecco perché visualizzi l'errore. Invece, crea il tuo ciclo for come segue:

for index in myArray.indices {
    // Do stuff
}

Si spera che questa risposta aiuti gli altri che non conoscono Swift o la programmazione.


è necessario utilizzare la proprietà degli indici dell'array durante l'iterazione della raccolta. Non tutte le collezioni iniziano con indice zero
Leo Dabus

0

Per rimuovere tutti gli elementi dell'array

var array = [1,2,3,4,5,6]()
array.removeAll()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.