Swift: Löscht alle Array-Elemente


108

Ich versuche, alle Array-Elemente mit einer for-Schleife wie folgt zu löschen:

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

Aber es funktioniert nicht, ich bekomme diesen Fehler vor dem Bulding:

Erwartet ';' in 'für' Anweisung


5
Einfach. Initialisieren Sie das Array neu ...
VJ

Antworten:


326

Es gibt eine Methode (eigentlich eine Funktion)

myArray.removeAll()

1
Wusste

11
@NoodleOfDeath Streng gesprochen Swift-Arrays sind structs und Strukturen haben im functionsGegensatz zu Klassen, die haben methods.
Vadian

1
@vadian +1 zur Verdeutlichung. Ich habe vergessen, dass Arrays s sind struct. Veteran Objective-C-Codierer hier ...
NoodleOfDeath

1
Müssen Sie die Funktion removeAll () aufrufen, wenn Sie eine Ansicht (viewcontroller) verlassen, in der Sie sie initialisieren, oder verschwindet sie von selbst?
Famic Tech

1
@FamicTech Es kommt darauf an: Wenn die Ansicht entladen wird, verschwindet sie implizit, wenn die Ansicht nur verschwindet, müssen Sie aufrufen removeAll(). Es ist jedoch eine gute (Speicherdisziplin) Praxis, alle unnötigen Daten zu entfernen, wenn eine Ansicht verschwindet.
Vadian

17

Die Antwort von @ vadian ist die Lösung , möchte ich nur darauf hinweisen, dass Ihr Code nicht funktioniert.

Zunächst einmal sind Array-Indizes 0-basiert, daher sollten Sie den Bereich entsprechend umschreiben:

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

Diese Implementierung wird jedoch einen Absturz verursachen. Wenn Sie ein Array von 10 Elementen haben, nimmt das letzte Element die Position bei Index 9 ein.

Bei Verwendung dieser Schleife wird bei der ersten Iteration das Element am Index 0 entfernt, und das letzte Element wird am Index 8 nach unten verschoben.

Bei der nächsten Iteration wird das Element bei Index 1 entfernt und das letzte Element bei Index 7 nach unten verschoben. Und so weiter.

Irgendwann in der Schleife führt ein Versuch, ein Element für einen nicht vorhandenen Index zu entfernen, zum Absturz der App.

Wenn Sie Elemente aus einem Array in einer Schleife entfernen, können Sie dies am besten in umgekehrter Reihenfolge durchlaufen:

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

Dadurch wird sichergestellt, dass entfernte Elemente weder die Reihenfolge noch den Index der noch zu verarbeitenden Elemente ändern.


1
Es gibt eine Funktion, um alle Elemente in nur einer Zeile zu entfernen. als @ vadians Antwort ...
VJ

3
@VJ das habe ich in der ersten Zeile meiner Antwort geschrieben :)
Antonio

+1 für eine Lösung, mit der eine bestimmte Instanz eines Objekts entfernt werden kann. Ich benutze 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 } }vorzugsweise nicht alle eine Zeile, aber dieser Code sollte in einer Zeile kompiliert werden
NoodleOfDeath

Warum nicht for _ in 0...<myArray.count { myArray.removeAtIndex(0) }? Ich weiß noch nicht viel über Effizienz, aber auf diese Weise müssen Sie den Bereich nicht umkehren, also ist es vielleicht schneller.
cbjeukendrup

Das funktioniert auch! Dieselbe Methode in Bezug auf Effizienz, entfernen Sie vom Anfang statt vom Ende, aber Sie speichern eine Variable :-)
Antonio

7

Ihnen fehlt das inSchlüsselwort, das Ihren Fehler verursacht. Der Code sollte sein:

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

Dies funktioniert jedoch aus mehreren Gründen nicht wie erwartet:

  • Der letzte gültige Index ist count - 1der, der erfordern würde1..<myArray.count
  • Noch wichtiger ist, dass das Entfernen eines Elements aus einem Array es verkürzt und somit die Indizes jedes Mal ändert.

Wenn Sie versuchen, alle Elemente aus dem Array zu entfernen, sollten Sie Folgendes tun und verwenden:

myArray.removeAll()

Wenn Sie nur das erste Element und nichts anderes möchten, können Sie einen Verweis auf das erste Objekt erhalten, das Array leeren und das Objekt wieder hinzufügen:

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

Entschuldigung, ich habe "in" nicht gesehen ... Hat +1
VJ

1
(+1) zur Erklärung des tatsächlichen Fehlers. (-1), da dies nicht funktioniert, da das Löschen eines Elements das Array kürzer macht. (Beachten Sie auch, dass der letzte gültige Index ist count - 1).
Martin R

7

Wenn Sie das Array wirklich löschen möchten, können Sie es am einfachsten neu initialisieren.


3

Ihr Code sollte funktionieren, er ist einfach nicht gebunden.

Swift 3

existingArray = []

Auf diese Weise weisen Sie dem vorhandenen Array ein leeres Array zu und der Datentyp wird referenziert.

Alternativ können Sie verwenden, um removeAllalle Elemente aus dem Array zu entfernen und eine Option bereitzustellen, um die vorhandene Kapazität beizubehalten.

existingArray.removeAll()

Dies ist eine mutatingFunktion, die bedeutet, dass das Array, das die Methode aufruft, geändert wird (leer).


2

Kyle ist auf dem richtigen Weg, aber sein Code wird fehlschlagen, da sich die möglichen Indizes während der Aufzählung verringern, was zu illegalen Indizes führt.

Eine Möglichkeit, dies zu lösen, besteht darin, rückwärts aufzuzählen. In Kürze erfolgt dies mit Schritten .

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

Eine andere Möglichkeit wäre die Verwendung filter()

Swift 1.2

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

Swift 2

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

Sehr interessant! Ich wusste nicht überstride
Kyle Decot

1

In Swift 2 ist die Methode removeAllObjects () verfügbar

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

Um Elemente an einem bestimmten Index zu entfernen, verwenden Sie:

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

Um das letzte Element zu entfernen, verwenden Sie:

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

Um Elemente in einem bestimmten Bereich zu entfernen, verwenden Sie:

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

Um bestimmte Elemente zu entfernen, verwenden Sie:

Syntax : public func removeObject(anObject: AnyObject)

Der folgende Screenshot zeigt eine Liste der in der NSMutableArray-Erweiterung verfügbaren Methoden

Screenshot 1


0

Sie können dies auch tun:

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

2
Diese Lösung ist furchtbar ineffizient - bei jeder Iteration werden alle nachfolgenden Objektindizes verschoben. Ich bin mir auch nicht sicher, ob diese Implementierung sicher ist. Zumindest in Objective-C-Sammlungen ist eine Mutation während der Aufzählung verboten.
Borys Verebskyi

0

Zum Entfernen aller Daten aus einem Array

yourArrayData.removeAll()


0

Vadian hat die richtige Antwort in Bezug auf das, was Sie erreichen wollen. Das Problem, das als Ergebnis Ihres Codebeispiels angezeigt wird, ist auf die Art und Weise zurückzuführen, wie Sie versuchen, die forSchleife zu erstellen . Indexwird standardmäßig bei 0 beginnen. Das Hinzufügen in einem Nummernkreis, nachdem dies nicht der richtige Weg ist, um eine for-Schleife zu erstellen. Deshalb sehen Sie den Fehler. Erstellen Sie stattdessen Ihre for-Schleife wie folgt:

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

Hoffentlich hilft diese Antwort anderen, die Swift oder die Programmierung noch nicht kennen.


Sie sollten die Eigenschaft array indices verwenden, um die Sammlung zu iterieren. Nicht alle Sammlungen beginnen bei Null Index
Leo Dabus

0

Zum Entfernen aller Elemente des Arrays

var array = [1,2,3,4,5,6]()
array.removeAll()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.