基本方法不起作用。
for index in 0 ..< list.count {
if list[index] == nil {
list.removeAtIndex(index) //this will cause array index out of range
}
}
0 ..< list.count
,此时list
仍具有所有元素。每次删除一个元素后,list.count
会递减,但迭代范围不会修改。你最终会读取过多。
在Swift 4.1及以上版本中,您可以使用compactMap
来丢弃序列中的nil
元素。compactMap
返回一个非可选值数组。
let list: [Foo?] = ...
let nonNilElements = list.compactMap { $0 }
如果您仍然想要一个包含可选项的数组,可以使用 filter
函数移除其中的 nil
元素:
过滤器(filter)
来删除nil
元素:list = list.filter { $0 != nil }
在Swift 2.0中,您可以使用flatMap:
list.flatMap { $0 }
flatMap { $0 }
去除 nils 可能会导致错误。相反,使用类似于 removeNils()
的扩展方法来解决这个问题,具体实现可以参考这里:https://dev59.com/CV4c5IYBdhLWcg3wM3-R#38548106。 - Senseful现在在swift 4.2中,您可以使用
list.compactMap{ $0 }
list.flatMap{ $0 }
已经过时。
compacted()
函数。import Algorithms
let array = [10, nil, 20, nil, 30]
print(array.compacted()) // prints [10, 20, 30]
更多信息请查看https://github.com/apple/swift-algorithms/blob/main/Guides/Compacted.md