2016-05-13 3 views
0

拡張機能をジェネリック型に書き込もうとしていますが、何らかの理由で機能していません。スイフト。エクステンションからジェネリックタイプを取得するには?

私は、一般的な列挙型をした:私はこの列挙にはいくつかの拡張機能を記述して、例えば列挙型の汎用のparamsで別の汎用クラスを作成したい

public enum ResponseResult<Result, Error> { 

    case Success(result: Result) 
    case Failure(error: Error?) 
} 

extension ResponseResult { 

     var response: Response<T> { 
      return Response(value: self.value) 
     } 
    } 

Tは - 'されますResponseResultクラスのResult '汎用パラメータ。 しかし、エクステンションのジェネリックパラメータを取得する方法を理解できません。列挙型の値からパラメータを抽出するために

+0

「T」が必要な理由は明確ではありません。それはなぜですか? – Pascal

+0

@Pascal isはResponseクラスの汎用パラメータです。私は単純なコードの例を書こうとしています。すべてのコードを入れないようにしています。 –

+0

拡張の 'ResponseResult' enumの' Result'ジェネリックパラメータを使いたいだけですか? 'T'の代わりに' Result'を打つだけでしたか?元の宣言の汎用パラメータは、拡張モジュールで使用可能にする必要があります。 – Hamish

答えて

1

、あなたはswitch-caseを使用することができます。

switch response { 
case .Success(let result): 
    print("Success: \(result)") 
case .Failure(let error): 
    print("Error: \(error)") 
} 

拡張子の中にいる場合は、単にselfresponseを交換してください。そのパターンは

extension ResponseResult { 

    var response: Response<Result>? { 
     switch self { 
      case .Success(let result): 
       return Response(value: result) 
      case .Failure: // Ignore error parameter 
       return .None 
     } 
    } 
} 

Alamoreは、エラー処理のために使用するものと非常によく似(まったく同じ)されています。あなたの特定のシナリオで

が、多分これはあなたが探しているものです。より多くのサンプルについては、コードとドキュメントを参照できます。

+0

ありがとう!そのような簡単な方法については考えなかった=) –

関連する問題