我试图写一个扩展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)