是否有内置函数可映射非nil元素并删除数组的nil元素?

时间:2019-07-16 18:38:47

标签: arrays swift higher-order-functions

我想映射一个可选数组,删除那些为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)
}

但是我想知道是否有内置功能,或者更简单的方法。

谢谢。

2 个答案:

答案 0 :(得分:3)

您可以将compactMap(将删除nil的值)与Optional中的flatMap(仅当可选项不是{ {1}},然后仅返回nil,例如

nil

结果:

  

[2,4,8]

答案 1 :(得分:2)

我认为这很简单:

myArray.lazy.compactMap { $0 }.map { /*whatever*/ }