2016-05-13 10 views
0

Ich versuche, Erweiterung zu generischen Typ zu schreiben, aber aus einigen Gründen funktioniert nicht.Schnell. Wie bekomme ich einen generischen Typ von der Erweiterung?

Ich habe generic Enum:

public enum ResponseResult<Result, Error> { 

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

Ich möchte einige Erweiterung dieses Enum und schreiben, zum Beispiel erstellen Sie eine andere generische Klasse mit Enum-generic params:

extension ResponseResult { 

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

T - ist ' Result 'generischer Parameter von ResponseResult Klasse. Aber ich verstehe nicht, wie ich generische Parameter in der Erweiterung holen kann.

+0

Es ist nicht klar, was Sie brauchen 'T' für, warum ist es da? – Pascal

+0

@Pascal ist ein generischer Parameter für die Antwortklasse. Ich versuche, einfaches Codebeispiel zu schreiben, um nicht alle Menge des Codes zu setzen –

+0

So wollen Sie nur den Generic-Parameter 'Result' aus der 'ResponseResult'-Enumeration in der Erweiterung verwenden? Haben Sie versucht, nur "Ergebnis" anstelle von "T" einzugeben? Die generischen Parameter aus der ursprünglichen Deklaration sollten in der Erweiterung verfügbar sein. – Hamish

Antwort

1

Um die Parameter aus den ENUM-Werte zu extrahieren, Sie switch-case verwenden können:

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

Wenn Sie in einer Verlängerung sind, einfach response mit self ersetzen.

In Ihrem speziellen Szenario, vielleicht ist es das, was Sie suchen:

extension ResponseResult { 

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

Dieses Muster sehr ähnlich ist (genau das gleiche), was Alamore verwendet für die Fehlerbehandlung. Sie können ihren Code und die Dokumentation für weitere Beispiele sehen.

+0

Danke! Dachte nicht über so einen einfachen Weg =) –