2016-03-14 99 views

回答

6

傳統

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

功能替代

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

enumerate取元件的陣列,並且其中每個元組是一個索引陣列對返回的元組的陣列(例如(.0 3, .1 "d")) 。然後我們使用模運算符刪除奇數的元素。最後,我們使用map將元組數組轉換回正常數組。 HTH

+1

謝謝!我學到了枚舉()。 –

12

而不是使用C語言風格的for循環(這是坐落在斯威夫特的即將推出的版本中被取消),你可以做到這一點使用大步:

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

或爲更實用的解決方案,

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

還有一堆不同的方式來做到這一點,但這裏有一對夫婦,我發現有趣:

使用flatMap()Ø ñindices

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

注:要定義result需求爲[String],否則編譯器不知道使用哪種flatMap()版本。

或者,如果要修改,以取代原有的數組:

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

在這種情況下,你必須首先調用reverse()indices讓他們以相反的順序列舉。否則,當你到達數組的末尾時,你將試圖刪除一個不存在的索引。

+0

請注意,刪除整個數組時,索引刪除非常昂貴。 – Alexander

相關問題