如何删除 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 ..< 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 元素?的主要内容,如果未能解决你的问题,请参考以下文章