更简单的方法来过滤Swift数组中的nil

7ba*_*all 6 ios swift

假设我有一个名为的Swift对象Animal。我有一系列Animal对象,其中一些可能是nil

目前,我正在这样做:

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

由于力量解开,这感觉很hacky。想知道是否有更好的方法可以滤除nil。

Mar*_*n R 14

flatMap() 做这项工作:

let filtered = arrayOfAnimal.flatMap { $0 }
Run Code Online (Sandbox Code Playgroud)

将闭包(此处是标识)应用于所有元素,并返回具有非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>
Run Code Online (Sandbox Code Playgroud)

对于Swift 4.1及更高版本,请替换flatMapcompactMap

  • 我会改用compactMap,因为flatMap现在在Swift 4.0中已贬值。 (3认同)

pic*_*ano 10

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

struct Animal {}

let arrayOfAnimal: [Animal?] = [nil, Animal(), Animal(), nil]
let newArray: [Animal] = arrayOfAnimal.compactMap { $0 }
Run Code Online (Sandbox Code Playgroud)

  • 是的,flatMap 已被弃用 (2认同)