2017-09-09 1 views
0

Weiß jemand wie man Template on Response erreicht, aber ohne zusätzliches Casting? Nun, wenn ich das tue, gibt Xcode mir Fehler zurück, dass ich T nicht dynamisch überschreiben kann. Aber ich glaube wirklich, dass ich auf dem richtigen Weg bin, aber etwas verpasst habe. Nein?Swift Response Template ohne zusätzliches Casting

Jetzt ist es wie folgt aussieht: func didReciveResponse(request: Request, response: Response<Any>)

enum Response<T> { 
     case success(response: T) 
     case failured(error: Error) 
    } 

    func pseudoResponse() { 
     let time: Timeinterval = 3 
     // somehow cast T (compiler shows error that I can't do this) 
     let response = .success<Timeinterval>(time) 
     didReciveResponse(.time, response) 
    } 

    // delegate method 
    func didReciveResponse(request: Request, response: Response) { 
     switch request { 
      case .time: 
      switch response { 
       // response without additional casting (as?) 
       case .success(let value): time = value 
      } 
     } 
    } 

Antwort

0

Da der Compiler den generischen Typ nicht ableiten, können Sie den Typ in diesem Fall

func pseudoResponse() { 
    let time: TimeInterval = 3.0 
    let response : Response<TimeInterval> = .success(response: time) 
    didReciveResponse(request: .time, response: response) 
} 

mit Anmerkungen versehen haben, und Sie müssen angeben, die Response Art in die Delegiertenmethode

func didReciveResponse(request: Request, response: Response<TimeInterval>) { ... 

jedoch Wenn Sie didReciveResponse (eigentlich didReceiveResponse) auch generisch machen möchten, müssen Sie schreiben