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

问题描述

如果只想扩展特定类型的数组。您应该扩展_ArrayType协议。

extension _ArrayType where Generator.Element == Int {

   func doSomething() {
       ... 
   }
}

如果扩展Array,则只能确保您的元素符合其他协议。即:

extension Array where Element: Equatable {

   func doSomething() {
       ... 
   }
}

https://github.com/apple/swift/blob/master/CHANGELOG.md

extension Array where Element == Int {

   func doSomething() {
       ... 
   }
}

解决方法

我想使用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,vDSP_Length(x.count))
        }
        return result
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...