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
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
Antworten:
Es gibt eine Methode (eigentlich eine Funktion)
myArray.removeAll()
structs und Strukturen haben im functionsGegensatz zu Klassen, die haben methods.
Arrays s sind struct. Veteran Objective-C-Codierer hier ...
removeAll(). Es ist jedoch eine gute (Speicherdisziplin) Praxis, alle unnötigen Daten zu entfernen, wenn eine Ansicht verschwindet.
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.
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
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.
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:
count - 1der, der erfordern würde1..<myArray.countWenn 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)
count - 1).
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).
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
}
stride
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
Sie können dies auch tun:
for _ in myArray
{
myArray.removeAtIndex(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.
Zum Entfernen aller Elemente des Arrays
var array = [1,2,3,4,5,6]()
array.removeAll()