一尘不染

在Swift中创建扩展以从数组中过滤nil

swift

我正在尝试对Array进行扩展,以允许将可选T的数组转换为非可选T的数组。

例如,这可以写成这样的自由函数:

func removeAllNils(array: [T?]) -> [T] {
    return array
        .filter({ $0 != nil })   // remove nils, still a [T?]
        .map({ $0! })            // convert each element from a T? to a T
}

但是,我无法将此作为扩展。我试图告诉编译器,扩展名仅适用于可选值数组。这是我到目前为止的内容:

extension Array {
    func filterNils<U, T: Optional<U>>() -> [U] {
        return filter({ $0 != nil }).map({ $0! })
    }
}

(它不会编译!)


阅读 394

收藏
2020-07-07

共1个答案

一尘不染

不可能限制为通用结构或类定义的类型-数组旨在与任何类型一起使用,因此您不能添加适用于类型子集的方法。类型约束只能在声明泛型时指定

实现所需功能的唯一方法是创建全局函数或静态方法-在后一种情况下:

extension Array {
    static func filterNils(array: [T?]) -> [T] {
        return array.filter { $0 != nil }.map { $0! }
    }
}

var array:[Int?] = [1, nil, 2, 3, nil]

Array.filterNils(array)

或简单地使用compactMap(以前为flatMap),该方法可用于删除所有nil值:

[1, 2, nil, 4].compactMap { $0 } // Returns [1, 2, 4]
2020-07-07