2015-07-22 19 views
20

Podstawowy sposób nie działa.Jak mogę usunąć wszystkie elementy zerowe w tablicy Swift?

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

Możliwy duplikat [Swift: skrót rozpakowaniu tablicy optionals] (http://stackoverflow.com/questions/25589605/swift-shortcut-unwrapping- of-array-of-optionsals) – Senseful

Odpowiedz

45

użytkowania filter odfiltrować nil elementy:

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

Problem z kodem jest 0 ..< list.count jest wykonywany raz na początku pętli, gdy list nadal posiada wszystkie jego elementy. Za każdym razem, gdy usuwasz jeden element, list.count jest zmniejszany, ale zakres iteracji nie jest modyfikowany. W końcu czytasz za daleko.

EDIT Usunięto pętli C-stylu, ponieważ jest nieprawidłowy (z powodów innych niż @MartinR wskazał przed usunięciem jego komentarz, ale mimo to błędne).

EDIT 2 Teraz, gdy Swift ma flatMap, Marcel Molina's answer jest lepszy.

65

w Swift 2.0 można użyć flatMap:

list.flatMap { $0 } 
+0

Ma to także dodatkową zaletę, ponieważ nie wymaga, aby obiekty na liście były Równoważne. – Tim

+0

Teraz, kiedy to mamy, jest to lepsze rozwiązanie. – zneak

+1

Doskonała odpowiedź – onmyway133

Powiązane problemy