はPAT

2016-05-20 4 views
0

と拡張を適用しようとしたとき、これは失敗している理由を私は理解していないプロトコルエラーに準拠していません:はPAT

import Foundation 
import simd 

protocol TestProtocol { 
    associatedtype ElementType 
    func reduce_add(x:Self) -> ElementType 
} 

extension float2 : TestProtocol { 
    typealias ElementType=Float 
} 

私は「タイプ 『するfloat2は』プロトコルに準拠していない得る 『TestProtocol』 "プレイグラウンドでのエラーです。具体的には、私に語った:

/// Sum of the elements of the vector. 
@warn_unused_result 
public func reduce_add(x: float2) -> Float 

と私はreduce_add(float2(2.4,3.1))を呼び出す場合、私は右の結果を得る:

Playground execution failed: Untitled Page.xcplaygroundpage:3:1: error: type 'float2' does not conform to protocol 'TestProtocol' extension float2 : TestProtocol {^Untitled

Page.xcplaygroundpage:6:10: note: protocol requires function 'reduce_add' with type 'float2 -> ElementType' func reduce_add(x:Self) -> ElementType

私はsimdインターフェースを見てみると、しかし、私は参照してください。 ElementTypeはtypealiasFloatです。

ここで私は間違っていますか?

答えて

1

simdモジュールから既存

public func reduce_add(x: float2) -> Float 

グローバル関数であり、あなたのプロトコル はインスタンスメソッドを必要とします。

プロトコルを使用してグローバル関数が存在することを要求することはできません。 インスタンスメソッドが必要な場合は、次のようになります。

protocol TestProtocol { 
    associatedtype ElementType 
    func reduce_add() -> ElementType 
} 

extension float2 : TestProtocol { 
    func reduce_add() -> Float { 
     return simd.reduce_add(self) 
    } 
} 

let f2 = float2(2.4, 3.1) 
let x = f2.reduce_add() 
print(x) // 5.5 
+0

Ah。私はあなたがグローバルなオペレータを必要とすることができるという事実が混乱していると思うが、明らかに特殊なケースである。だから私の目標はベクトル型を渡って一般化することです、私はインスタンス関数としてsimdライブラリ全体をミラーリングする必要がありますか? – Omegaman

+0

@Omegaman:はい。 (少なくとも現時点では私の考えは変わりません。) –

関連する問題