2017-08-14 11 views
3

このメソッドのシグネチャは、スウィフト4でコンパイルできないことを不合理なようだ:Where句は、汎用パラメータを持つ関数でのみ有効ですか?

class Bar<ValueType> { 
    func version() throws -> String where ValueType == [String: Any] { ... } 
} 

(エラー:句は非ジェネリック宣言に添付することはできません)
が、これは罰金コンパイル:

class Bar<ValueType> { 
    func version<T>(_ foo: T? = nil) throws -> String where ValueType == [String: Any] { ... } 
} 

これがなぜこのような場合に誰かが洞察を持っていますか?

答えて

1

ValueTypeは、この方法(最初の例)とは関係がないためです。このようなメソッドを型(class/struct/enum)に入れるのは間違いでしょう。なぜなら、その型の本当のメンバーではないからです。条件付きでは、where句の真理値に応じて、そのタイプのメンバーです。

これを実現するには、このメソッドをタイプの拡張子に入れて、希望するwhere節を付けます。例えば。

+0

コンパイラの制限ではなく、ベストプラクティスを強制するためのwhere句の使用に関する制限はありますか? –

+0

@SidManiいいえ、それは、関数が型の宣言本体の中にあることを意味するものの単なる結果です。これは、関数が型に存在するメソッドであることを意味します。あなたが持っているものは、そのタイプに存在するメソッドではありません。あなたは、その型にcan * might *メソッドが存在します。 – Alexander

+0

@SidManiこれは可能なルールを作ることができましたが、それはトータルなショーショーになります。表示されるすべてのメソッドについて、関連する 'where'節をチェックして、メソッドが適用可能かどうかを確認する必要があります。これは、すべて同じwhere句を共有する多数のメソッドの場合に当てはまる可能性があります。それは非常に混乱し、不必要に複雑です – Alexander

関連する問題