在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