2016-03-28 16 views
0

これはなぜ次の場合に失敗しますか?関数宣言行でInheritance from non-protocol, non-class type?しかし、の場合に関数汎用パラメータを関連タイプに制限します

protocol Foo { 
    associatedtype A 
} 

struct Container<F: Foo> { 

    func f(a: F.A) { } 
} 

struct Container<F: Foo> { 

    func f<A : F.A>(a: A) { } // error: inheritance from non-protocol, non-class type 
} 

...タイプF.Aは完全に拘束されないので、それもあってもよい、

protocol Foo { 
    associatedtype AType 
} 

struct Container<F: Foo> { 

    let foo: F 

    func doWork<S: F.AType>(s: S) { } 
} 

答えて

1

注以下コンパイルされることたとえば、Intは、:構文を継承したり、それに準拠することはできません。あなたが本当に(a: F.A)よりもより一般的な解決策が必要な場合は

その後、これらの線に沿って何かがそれを行う可能性があります:

protocol Bar { } 

protocol Foo { 
    associatedtype A : Bar 
} 

struct Container<F: Foo> { 

    func f<A : Bar>(a: A) { } 
} 

あなたは今Barプロトコルを使用してaパラメータについての期待を表明することができます。

まだ、あなたはFooの延長としてメソッドを実装することができるかもしれないよりよい:

protocol Foo { 
    associatedtype A 

    func f(_: A) // if you want this to be a requirement 
} 

extension Foo /* where A is constrained so you can do something with it */ { 

    func f(a: A) { } 
} 
+0

私のユースケースでは、 'Container'メソッドは' F'は 'Fooのサブクラスであるように制約されなければなりません''タイプ。つまり、型 'Foo.A'またはサブクラスのいずれかでなければなりません。 F.Aが拘束されていないということが問題だと言うと、あなたが正しいかどうかはわかりません。結局 'associatedtype A:Bar'を作ると' func f (a:A){} 'はまだ失敗します。 – Stephen

+0

私はスニペットの違いに気付きました。私はあなたが 'F.Aが完全に拘束されていません 'というエラーの理由として引用した箇所に応えていました。制約があっても、結果は同じです。関連する型を制約として使用できないのはなぜですか? – Stephen

関連する問題