如何在Swift中删除数组中的每个其他元素?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Swift中删除数组中的每个其他元素?相关的知识,希望对你有一定的参考价值。

所以说我有一个数组:

var stringArray = ["a","b","c","d","e","f","g","h","i","j"]

现在,如何删除“a”,“c”,“e”,“g”和“i”(数组中的所有偶数索引)?

谢谢!

答案

您可以使用步幅来完成此操作,而不是使用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] }
另一答案

传统

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

另一答案

有很多不同的方法来实现这一目标,但这里有一些我觉得有趣的方法:

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,以便它们以相反的顺序枚举。否则,当您到达数组末尾时,您将尝试删除不再存在的索引。

另一答案

Swift 4.2

一种接受泛型并产生降低结果的函数

func stripElements<T>(in array:[T]) -> [T] {
    return array.enumerated().filter { (arg0) -> Bool in
        let (offset, _) = arg0
        return offset % 2 != 0
        }.map { $0.element }
}

以上是关于如何在Swift中删除数组中的每个其他元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 Swift 数组中的所有 nil 元素?

swift 删除排序数组中的重复项

Swift 3 数组 - 在其他数组的帮助下删除多个元素

在 SpriteKit/Swift 中从数组中删除元素

Swift Firestore 删除嵌套在文档中的数组中的元素时出现问题

Swift 数组删除元素