2016-03-26 4 views
1

Swiftでは、ジェネリック関数を暗黙的に特殊化するために、パラメータの型または戻り値を使用する必要があります。なぜジェネリック関数を明示的に特殊化できないのですか?

func serialize<T>(continuation: GenericWithLongName<T, NSError> -> Void) -> Void 

私はちょうどそれが苦痛になります

serialize { 
    (obj: GenericWithLongName<SomeType, NSError>) -> Void in 
    ... 
} 

でなければなりません

serialize<SomeType> { 
    obj in 
    ... 
} 

を書き込むことはできません。私はこのような関数を呼び出すときに問題があります。

この「機能」は長い間存在しているようです。それは設計上の決定ですか?明示的な専門化を許可することによる否定的な示唆はありますか?

そして、ジェネリッククラスをリファクタリングせずに、コードをすっきりと清潔にする方法はありますか?

serialize(SomeType.self) { 
    obj in 
    ... 
} 

Iドン:今すぐ

func serialize<T>(
    t: T.Type, 
    continuation: GenericWithLongName<T, NSError> -> Void) -> Void { } 

は、あなたがこのような機能を「特化」することができます

答えて

2

一つの方法は、関数は、関数のパラメータとしてジェネリック型を含むことである「特化」しますあなたの要求された機能が利用できない理由を知ることはできません。私は、あなたがお勧めの機能は役に立つと思っていますが、その間にも同様に機能し、ほぼ簡潔です。

関連する問題