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

Posted

技术标签:

【中文标题】如何删除 Swift 数组中的所有 nil 元素?【英文标题】:How can I remove all nil elements in a Swift array? 【发布时间】:2015-07-22 18:49:16 【问题描述】:

基本方法行不通。

for index in 0 ..< list.count 
    if list[index] == nil 
        list.removeAtIndex(index) //this will cause array index out of range
    

【问题讨论】:

Swift: shortcut unwrapping of array of optionals的可能重复 【参考方案1】:

您的代码的问题是 0 ..&lt; list.count 在循环开始时执行一次,此时 list 仍然具有它的所有元素。每次删除一个元素时,list.count 会递减,但不会修改迭代范围。你最终读得太远了。

在 Swift 4.1 及更高版本中,您可以使用 compactMap 丢弃序列中的 nil 元素。 compactMap 返回一个非可选值数组。

let list: [Foo?] = ...
let nonNilElements = list.compactMap  $0 

如果您仍然想要一个可选数组,您可以使用filter 删除nil 元素:

list = list.filter  $0 != nil 

【讨论】:

【参考方案2】:

在 Swift 2.0 中,您可以使用 flatMap:

list.flatMap  $0 

【讨论】:

这还有一个额外的好处,就是不要求列表中的对象是平等的。 现在我们有了它,这是一个更好的解决方案。 依赖flatMap $0 删除空值可能会导致错误。使用extension method like removeNils() instead。【参考方案3】:

现在在 swift 4.2 中你可以使用

list.compactMap $0 

list.flatMap $0 已被弃用。

【讨论】:

flatMap 没有被弃用,而是现在有不同的用例【参考方案4】:

一个更优雅的解决方案是使用 Apple 自己制作的 Algorithms 包中定义的compacted()

import Algorithms

let array = [10, nil, 20, nil, 30]
print(array.compacted()) // prints [10, 20, 30]

好处

    简洁 懒惰地过滤掉 nil 项

更多信息https://github.com/apple/swift-algorithms/blob/main/Guides/Compacted.md

【讨论】:

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

如何在 Swift 中从数组中删除一个元素

如何将 JSON 数据存储到 swift3 中的数组(模型类)中?

Swift 数组删除元素

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

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

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