我想映射一个可选数组,删除那些为nil的值,并使用另一个函数来映射非nil值。
我知道我可以通过使用compactMap
然后使用常规的map
来实现这一点,但是我只想遍历数组一次。
我为此实现了一个mapNonNils
函数:
// Adapts a function to handle optional input
func adaptForOptional<T, R>(_ originalFunc: @escaping (T) -> R) -> (T?) -> R? {
return { optionalValue in
return (optionalValue != nil) ? originalFunc(optionalValue!) : nil
}
}
// maps over non-nil elements, and remove nils
extension Array {
func mapNonNils<T, E>(function: @escaping (E) -> T) -> [T] where Element == Optional<E> {
let adaptedFunction = adaptForOptional(function)
return self.compactMap(adaptedFunction)
}
}
// sample function
func double(num: Int) -> Int {
return num * 2
}
// doubles non-nil elements, and remove nils
func doubleNonNil(_ original: [Int?]) -> [Int] {
return original.mapNonNils(function: double)
}
但是我想知道是否有内置功能,或者更简单的方法。
谢谢。
答案 0 :(得分:3)
答案 1 :(得分:2)
我认为这很简单:
myArray.lazy.compactMap { $0 }.map { /*whatever*/ }