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

我正在尝试对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! })

}

}

(它不会编译!)

回答:

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

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

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]

以上是 在Swift中创建扩展以从数组中过滤nil 的全部内容, 来源链接: utcz.com/qa/405842.html

回到顶部