所以说我有一个数组:
var stringArray = ["a","b","c","d","e","f","g","h","i","j"]
现在,如何删除" a"," c"," e"," g"和" I" (数组中的所有偶数索引)?
谢谢!
答案 0 :(得分:12)
您可以使用步幅来完成此任务,而不是使用C风格的for循环(在即将推出的Swift版本中将其弃用):
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] }
答案 1 :(得分: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
答案 2 :(得分: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
,以便他们按相反的顺序进行枚举。否则,当您到达数组末尾时,您将尝试删除不再存在的索引。
答案 3 :(得分:0)
接受泛型并减少结果的函数
func stripElements<T>(in array:[T]) -> [T] {
return array.enumerated().filter { (arg0) -> Bool in
let (offset, _) = arg0
return offset % 2 != 0
}.map { $0.element }
}