Ich möchte ein Array in Swift auflisten und bestimmte Elemente entfernen. Ich frage mich, ob dies sicher ist und wenn nicht, wie ich das erreichen soll.
Derzeit würde ich Folgendes tun:
for (index, aString: String) in enumerate(array) {
//Some of the strings...
array.removeAtIndex(index)
}
ios
arrays
swift
enumeration
Andrew
quelle
quelle
filter
gibt ein neues Array zurück. Sie entfernen nichts aus dem Array. Ich würde nicht einmalfilter
eine Aufzählung nennen. Es gibt immer mehr als einen Weg, eine Katze zu häuten.Sie könnten überlegen,
filter
wie:Der Parameter von
filter
ist nur ein Abschluss, der eine Instanz vom Array-Typ (in diesem FallString
) verwendet und a zurückgibtBool
. Wenn das Ergebnis isttrue
, bleibt das Element erhalten, andernfalls wird das Element herausgefiltert.quelle
filter
filter
Methode in einemutating
Eins zu verwandeln (da ich dasmutating
Schlüsselwort gelesen habe, können Funktionen wie dieseself
stattdessen geändert werden)?Array
, um ihn alsmutating
und ähnlich dem Code der Frage zu markieren . Bedenken Sie jedoch, dass dies möglicherweise nicht immer von Vorteil ist. Auf jeden Fall jedes Mal , wenn Sie ein Objekt entfernen, könnte Ihr Array wird neu geordnet im Speicher. Somit könnte es effizienter sein, ein neues Array zuzuweisen und dann eine atomare Substitution mit dem Ergebnis der Filterfunktion vorzunehmen. Der Compiler kann je nach Code noch mehr Optimierungen vornehmen.In Swift 3 und 4 wäre dies:
Mit Zahlen nach Johnstons Antwort:
Mit Strings als OP-Frage:
In Swift 4.2 oder höher gibt es jedoch noch einen besseren und schnelleren Weg , den Apple im WWDC2018 empfohlen hat:
Dieser neue Weg hat mehrere Vorteile:
filter
.quelle
{$0 === Class.self}
funktioniert nichtWenn ein Element an einem bestimmten Index aus einem Array entfernt wird, wird die Position (und der Index) aller nachfolgenden Elemente geändert, da sie um eine Position zurück verschoben werden.
Der beste Weg ist also, das Array in umgekehrter Reihenfolge zu navigieren - und in diesem Fall empfehle ich die Verwendung einer herkömmlichen for-Schleife:
Meiner Meinung nach ist der beste Ansatz jedoch die Verwendung der
filter
Methode, wie sie von @perlfly in seiner Antwort beschrieben wurde.quelle
Nein, es ist nicht sicher, Arrays während der Aufzählung zu mutieren. Ihr Code stürzt ab.
Wenn Sie nur wenige Objekte löschen möchten, können Sie die
filter
Funktion verwenden.quelle
filter
ist es sicherer , funktionale Programmierfunktionen zu verwenden . Hier ist mein dummes Beispiel:var y = [1, 2, 3, 4, 5]; print(y); for (index, value) in y.enumerated() { y.remove(at: index) } print(y)
Erstellen Sie entweder ein veränderbares Array, um die zu löschenden Elemente zu speichern, und entfernen Sie diese Elemente nach der Aufzählung aus dem Original. Oder erstellen Sie eine Kopie des Arrays (unveränderlich), listen Sie diese auf und entfernen Sie die Objekte (nicht nach Index) aus dem Original, während Sie auflisten.
quelle
Die herkömmliche for-Schleife kann durch eine einfache while-Schleife ersetzt werden. Dies ist nützlich, wenn Sie vor dem Entfernen auch einige andere Operationen an jedem Element ausführen müssen.
quelle
Ich empfehle, Elemente während der Aufzählung auf Null zu setzen und nach Abschluss alle leeren Elemente mit der Methode arrays filter () zu entfernen.
quelle
filter
Methode nicht entfernt, sondern ein neues Array generiert.Wenn Sie mehrere Arrays haben und jedes Element im Index N von Array A mit dem Index N von Array B verknüpft ist, können Sie weiterhin die Methode verwenden, mit der das aufgezählte Array umgekehrt wird (wie in den vorherigen Antworten). Denken Sie jedoch daran, dass Sie beim Zugriff auf und Löschen der Elemente der anderen Arrays diese nicht umkehren müssen.
quelle