相关疑难解决方法(0)

使用Swift中的where子句扩展数组类型

我想使用Accelerate框架扩展[Float]和[Double],但每个都需要不同的实现.

我试过了明显的事:

extension Array<Float> {
}
Run Code Online (Sandbox Code Playgroud)

并得到此错误:

"必须在非特定的泛型类型'Array'上声明约束扩展,并使用'where'子句指定的约束"

以这种方式扩展Swift 2中的泛型类型是否可行?

我现在已经按预期运行了代码.这是一个使用Accelerate框架显示总和的示例.

extension _ArrayType where Generator.Element == Float {

    func quickSum() -> Float {
        var result: Float = 0
        if var x = self as? [Float] {
            vDSP_sve(&x, 1, &result, vDSP_Length(x.count))
        }
        return result
    }
}

extension _ArrayType where Generator.Element == Double {

    func quickSum() -> Double {
        var result: Double = 0
        if var x = self as? [Double] {
            vDSP_sveD(&x, 1, &result, vDSP_Length(x.count))
        }
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

generics swift swift-extensions swift2

70
推荐指数
4
解决办法
3万
查看次数

Swift中构造泛型类型的扩展

是否可以为专用/构造的泛型类型扩展泛型类?我想用一种方法扩展Int Arrays以计算其元素的总和.

例如

extension Array<Int> {

    func sum() -> Int {
        return reduce(0) { $0 + $1 }
    }

}
Run Code Online (Sandbox Code Playgroud)

generics swift

48
推荐指数
3
解决办法
3万
查看次数

Swift"where"数组扩展

从Swift 2.0开始,似乎我们可以更接近适用于谓词情境的泛型类型的扩展.

虽然我们仍然不能这样做:

protocol Idable {
    var id : String { get }
}

extension Array where T : Idable {
    ...
}
Run Code Online (Sandbox Code Playgroud)

......我们现在可以这样做:

extension Array {
    func filterWithId<T where T : Idable>(id : String) -> [T] {
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

...和Swift语法接受它.但是,对于我的生活,当我填写示例函数的内容时,我无法弄清楚如何让编译器开心.假设我要尽可能明确:

extension Array {
    func filterWithId<T where T : Idable>(id : String) -> [T] {
        return self.filter { (item : T) -> Bool in
            return item.id == id
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...编译器不会接受提供的过滤,过滤,抱怨

无法使用类型为'((T) - > Bool)'的参数列表调用'filter'

如果将item指定为Idable,则类似.这里有运气吗?

where-clause swift swift-extensions

26
推荐指数
1
解决办法
3万
查看次数

标签 统计

swift ×3

generics ×2

swift-extensions ×2

swift2 ×1

where-clause ×1