1. ホーム
  2. swift

Swiftでwhere節を使った配列型の拡張

2023-11-17 22:57:59

質問

Accelerateフレームワークを使用して[Float]と[Double]を拡張したいのですが、それぞれ別の実装が必要です。

当たり前のことをやってみた。

extension Array<Float> {
}

を実行すると、このようなエラーが発生します。

"制約付き拡張は、特殊化されていない一般的な 型 '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 を拡張した場合、その要素が他の何らかのプロトコルに適合していることを確認するだけでよいのです。

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() {
       ... 
   }
}