2016-03-14 6 views

Antwort

6

Traditionelle

var filteredArray = [] 
for var i = 1; i < stringArray.count; i = i + 2 { 
    filteredArray.append(stringArray[i]) 
} 

funktionelle Alternative

var result = stringArray.enumerate().filter({ index, _ in 
    index % 2 != 0 
}).map { $0.1 } 

enumerate nimmt ein Array von Elementen und gibt ein Array von Tupeln, wobei jedes Tupel ist ein Index-Array-Paar (zB (.0 3, .1 "d")) . Wir entfernen dann die ungeraden Elemente mit dem Modulo-Operator. Schließlich konvertieren wir das Tupel-Array zurück in ein normales Array mit map.

HTH
+1

Danke! Ich habe gelernt, aufzuzählen(). –

12

Statt C-style for-Schleifen verwenden (was in einer kommenden Version von Swift veraltet wird gesetzt), können Sie dies mit Schritten erreichen:

var result = [String]() 
for i in 1.stride(to: stringArray.count, by: 2) { 
    result.append(stringArray[i]) 
} 

Oder für eine noch funktionelle Lösung

,
let result = 1.stride(to: stringArray.count, by: 2).map { stringArray[$0] } 
2

Es gibt eine Reihe von verschiedenen Möglichkeiten, dies zu tun, aber hier sind ein paar, die ich interessant fand:

Mit flatMap() o n indices:

let result: [String] = stringArray.indices.flatMap { 
    if $0 % 2 != 0 { return stringArray[$0] } 
    else { return nil } 
} 

Hinweis:result Bedürfnisse definiert werden als ein [String] sonst der Compiler nicht weiß, welche Version von flatMap() zu verwenden.

Oder, wenn Sie das ursprüngliche Array anstelle ändern möchten:

stringArray.indices.reverse().forEach { 
    if $0 % 2 == 0 { stringArray.removeAtIndex($0) } 
} 

In diesem Fall müssen Sie zuerst reverse() auf indices nennen, so dass sie in umgekehrter Reihenfolge aufgezählt sind. Andernfalls werden Sie versuchen, einen Index, der nicht mehr existiert, zu entfernen, bis Sie das Ende des Arrays erreicht haben.

+0

Beachten Sie, dass das Entfernen im Index sehr teuer ist, wenn Sie das gesamte Array wie folgt entfernen. – Alexander

Verwandte Themen