Chuppa Chump Chuppa Chump - 2 months ago 99
Swift Question

POST request in Swift 3 dev snapshot gives "ambiguous reference to member 'dataTask(with:completionHandler:)'

I'm trying to make a POST request in the Swift 3 development snapshot but for some reason, the call to NSURLSession.dataTask fails with the error in the Title.

Here is the code I am using:

import Foundation

var err: NSError?
var params: Dictionary<String, String>
var url: String = "http://notreal.com"

var request = NSMutableURLRequest(url: NSURL(string: url)!)
var session = NSURLSession.shared()

request.httpMethod = "POST"
request.httpBody = try NSJSONSerialization.data(withJSONObject: params, options: [])
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

var task = session.dataTask(with: request, completionHandler: {data, response, err -> Void in
print("Entered the completionHandler")
})

task.resume()


The error is exactly:

testy.swift:19:12: error: ambiguous reference to member 'dataTask(with:completionHandler:)'
var task = session.dataTask(with: request, completionHandler: {data, response, err -> Void in
^~~~~~~
Foundation.NSURLSession:2:17: note: found this candidate
public func dataTask(with request: NSURLRequest, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Swift.Void) -> NSURLSessionDataTask
^
Foundation.NSURLSession:3:17: note: found this candidate
public func dataTask(with url: NSURL, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Swift.Void) -> NSURLSessionDataTask


Can anyone tell me:


  1. Why it's giving me this error

  2. How to successfully make a POST request with custom parameters in the latest Swift development snapshot using Foundation only (I am unable to use other third party libraries under any circumstances)



Thanks!

Answer

use URLRequest struct.

In Xcode8 beta will work fine:

import Foundation

// In Swift3, use `var` struct instead of `Mutable` class.
var request = URLRequest(url: URL(string: "http://example.com")!)
request.httpMethod = "POST"

URLSession.shared().dataTask(with: request) {data, response, err in
    print("Entered the completionHandler")
}.resume()

In addition, reason of this error is URLSession API has same name method, but each take a different argument .

So, API will be confused without explicit cast. I think this is API's naming mistake.

occurred this problem, following code:

let sel = #selector(URLSession.dataTask(with:completionHandler:))

poor english, sorry.