数组 – 创建一个扩展以从Swift中的数组中过滤nils

前端之家收集整理的这篇文章主要介绍了数组 – 创建一个扩展以从Swift中的数组中过滤nils前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图写一个扩展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)

猜你在找的Swift相关文章