我们说我有一个名为Animal
的Swift对象。我有一组Animal
个对象,其中一些可能是nil
。
目前我正在这样做:
arrayOfAnimal.filter({$0 != nil}) as! [Animal]
由于力量展开,这感觉相当hacky。想知道是否有更好的方法可以过滤掉nils。
答案 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 }