我想使用Accelerate框架扩展[Float]和[Double],但每个框架都需要不同的实现。
我尝试了明显的方法:
extension Array<Float> { }
并得到这个错误:
“必须在具有’where’子句指定约束的非专用泛型’Array’上声明受约束的扩展”
以这种方式在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 } }
如果只想扩展特定类型的数组。您应该扩展_ArrayType协议。
extension _ArrayType where Generator.Element == Int { func doSomething() { ... } }
如果扩展Array,则只能确保您的元素符合其他协议。即:
Array
extension Array where Element: Equatable { func doSomething() { ... } }
更新:使用Swift 3.1 https://github.com/apple/swift/blob/master/CHANGELOG.md
extension Array where Element == Int { func doSomething() { ... } }