我正在尝试对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值:
compactMap
flatMap
[1, 2, nil, 4].compactMap { $0 } // Returns [1, 2, 4]