Search code examples
swift2xcode7completionhandlersocrata

Completion handler giving: Type of expression is ambiguous without more context, after updating to swift 2


I'm using the SODA Client for swift (Created by Socrata), I just updated to XCode 7 and swift 2 and found some troubles. The one I haven't been able to solve is the completion handler case when it finds an error, it's not accepting the line "syncCompletion(.Error (reqError))" that supposedly should get the error and return to main thread.

I've seen many errors with the same description here "Type of expression is ambiguous without more context", but not in completion handlers, I saw one using do - catch that is different. I'm don't know enough of swift to find out the way to change this.

Some answers suppose you should rewrite the code because some types could have change in swift 2, but I wouldn't know where to start rewriting.

Thanks in advance for your help.

  var task = session.dataTaskWithRequest(request, completionHandler: { data, response, reqError in

        // We sync the callback with the main thread to make UI programming easier
        let syncCompletion = { res in NSOperationQueue.mainQueue().addOperationWithBlock { completionHandler (res) } }

        // Give up if there was a net error
        if reqError != nil {
            syncCompletion(.Error (reqError))
            return
        }

        // Try to parse the JSON
        //            println(NSString (data: data, encoding: NSUTF8StringEncoding))

        var jsonError: NSError?
        var jsonResult: AnyObject!
        do {
            jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
        } catch var error as NSError {
            jsonError = error
            jsonResult = nil
        } catch {
            fatalError()
        }
        if let error = jsonError {
            syncCompletion(.Error (error))
            return
        }

        // Interpret the JSON
        if let a = jsonResult as? [[String: AnyObject]] {
            syncCompletion(.Dataset (a))
        }
        else if let d = jsonResult as? [String: AnyObject] {
            if let e : AnyObject = d["error"] {
                if let m : AnyObject = d["message"] {
                    syncCompletion(.Error (NSError(domain: "SODA", code: 0, userInfo: ["Error": m])))
                    return
                }
            }
            syncCompletion(.Dataset ([d]))
        }
        else {
            syncCompletion(.Error (NSError(domain: "SODA", code: 0, userInfo: nil)))
        }
    })

Solution

  • Solved, I replaced:

    if reqError != nil 
    

    With

    if let error = reqError 
    

    and:

     syncCompletion(.Error (reqError)) 
    

    with

     syncCompletion(.Error (error))