2016-03-14 53 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

相关问题