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

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

Antworten:

326

Es gibt eine Methode (eigentlich eine Funktion)

myArray.removeAll()
vadian
quelle
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.

Antonio
quelle
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)
Kyle Decot
quelle
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.

VJ
quelle
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).

Lorem Ipsum Dolor
quelle
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
}
vikingosegundo
quelle
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

Jayprakash Dubey
quelle
0

Sie können dies auch tun:

for _ in myArray
{
    myArray.removeAtIndex(0)
}
Darth Flyeater
quelle
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()

PatelFab
quelle
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.

Josh Hrach
quelle
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()
Imran Rasheed
quelle