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) { }
}
私のユースケースでは、 'Container'メソッドは' F'は 'Fooのサブクラスであるように制約されなければなりません''タイプ。つまり、型 'Foo.A'またはサブクラスのいずれかでなければなりません。 F.Aが拘束されていないということが問題だと言うと、あなたが正しいかどうかはわかりません。結局 'associatedtype A:Bar'を作ると' func f (a:A){} 'はまだ失敗します。 – Stephen
「関連タイプA:バー」、「func f (a:A){}」を提案したことはありませんでした。 'Bar'スニペットをもっと慎重に見てください...あなたが必要とするものなら' Bar'を特定のクラスに置き換えることができます。 「確かではない」に関しては、私の解説(例えば、F.Aが「Int」である場合など)に特に異論はありますか? – milos
私はスニペットの違いに気付きました。私はあなたが 'F.Aが完全に拘束されていません 'というエラーの理由として引用した箇所に応えていました。制約があっても、結果は同じです。関連する型を制約として使用できないのはなぜですか? – Stephen