2015-07-22 5 views
20

Grundlegende Weise funktioniert nicht.Wie kann ich alle Nullelemente in einem Swift-Array entfernen?

for index in 0 ..< list.count { 
    if list[index] == nil { 
     list.removeAtIndex(index) //this will cause array index out of range 
    } 
} 
+0

Mögliche Duplikat [Swift: Verknüpfung von Array von optionals Abwickeln] (http://stackoverflow.com/questions/25589605/swift-shortcut-unwrapping- of-array-of-optionals) – Senseful

Antwort

45

Verwenden filter-nil Elemente herauszufiltern:

list = list.filter { $0 != nil } 

Das Problem mit Ihrem Code ist, dass 0 ..< list.count am Anfang der Schleife einmal ausgeführt wird, wenn list noch alle seine Elemente. Jedes Mal, wenn Sie ein Element entfernen, wird list.count dekrementiert, aber der Iterationsbereich wird nicht geändert. Am Ende liest du zu weit.

BEARBEITEN Die Schleife im C-Stil wurde entfernt, weil sie falsch ist (aus anderen Gründen als @MartinR, bevor er seinen Kommentar gelöscht hat, aber trotzdem inkorrekt).

EDIT 2 Jetzt, dass Swift flatMap hat, ist Marcel Molina's answer besser.

65

In Swift 2.0 können Sie flatMap verwenden:

list.flatMap { $0 } 
+0

Dies hat auch den zusätzlichen Vorteil, dass die Objekte in der Liste nicht gleichgesetzt werden müssen. – Tim

+0

Jetzt, da wir es haben, ist dies eine bessere Lösung. – zneak

+1

Brillante Antwort – onmyway133

Verwandte Themen