更清洁的方式来过滤Swift数组中的nil

时间:2017-12-15 19:57:56

标签: ios swift

我们说我有一个名为Animal的Swift对象。我有一组Animal个对象,其中一些可能是nil

目前我正在这样做:

arrayOfAnimal.filter({$0 != nil}) as! [Animal]

由于力量展开,这感觉相当hacky。想知道是否有更好的方法可以过滤掉nils。

2 个答案:

答案 0 :(得分:6)

flatMap()完成工作:

let filtered = arrayOfAnimal.flatMap { $0 }

闭包(这里是身份)适用于所有人 元素和返回非nil结果的数组。 返回类型为[Animal],不需要强制转换。

简单示例:

let array: [Int?] = [1, nil, 2, nil, 3]
let filtered = array.flatMap { $0 }

print(filtered)            // [1, 2, 3]
print(type(of: filtered))  // Array<Int>

对于 Swift 4.1 及更高版本,请将flatMap替换为compactMap

答案 1 :(得分:1)

您的代码有效,但有更好的方法。使用flatMap功能。

struct Animal {}

let arrayOfAnimal: [Animal?] = [nil, Animal(), Animal(), nil]
let newArray: [Animal] = arrayOfAnimal.flatMap { $0 }
相关问题