Moya: Xcode error with new requestClosure in 7.0

My request closure looks like this:

let requestClosure = { (endpoint: Moya.Endpoint<ICanHazProvider>, done: Result<NSURLRequest, Moya.Error> -> Void) in
  let request = endpoint.urlRequest.mutableCopy() as! NSMutableURLRequest

  if let token = self.getToken() {
    request.setValue(token, forHTTPHeaderField: "token")
  }

  return done(.Success(request))
}

hazAPI = MoyaProvider<ICanHazProvider>(endpointClosure: endpointClosure, requestClosure: requestClosure)

I’m getting the following error in Xcode now:

Unable to infer closure return type in current context

Is there any secret to getting this to work?

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 20 (8 by maintainers)

Most upvoted comments

@ashfurrow Well, as I was preparing the example project, I realized that if I omit the variable type declarations in the closure it seems to compile and work fine. So I changed

let requestClosure = { (endpoint: Moya.Endpoint<ICanHazProvider>, done: Result<NSURLRequest, Moya.Error> -> Void) in
  let request = endpoint.urlRequest.mutableCopy() as! NSMutableURLRequest

  if let token = self.getToken() {
    request.setValue(token, forHTTPHeaderField: "token")
  }

  return done(.Success(request))
}

to

let requestClosure: MoyaProvider<ICanHazProvider>.RequestClosure = { endpoint, done in
  let request = endpoint.urlRequest.mutableCopy() as! NSMutableURLRequest

  if let token = self.getToken() {
    request.setValue(token, forHTTPHeaderField: "token")
  }

  done(.Success(request))
}

So - the issue is really weird. If you do:

let endpointClosure = { (target: GitHub) -> Endpoint<GitHub> in
            let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
            let endpoint: Endpoint<GitHub> = Endpoint<GitHub>(URL: url, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
            return endpoint
        }

 _ = MoyaProvider<GitHub>(endpointClosure: endpointClosure)

Everything is peachy. If you pass all the parameters, even if you copy them from the default implementation of init it gets the above result. So:

  1. The issue isn’t with endpointClosure.
  2. Issue is with Xcode? compiler? I have no idea and unfortunately after being stuck for one day with this I don’t have more time to dig deeper

@sunshinejr omitting the Result type did the trick, thanks!

I should clarify a bit: Error is on the next line:

hazAPI = MoyaProvider<ICanHazProvider>(endpointClosure: endpointClosure, requestClosure: requestClosure)