Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

Edit: I note that someone wrote a duplicate of this question subsequent to mine. The answer here is the better one.

like image 867
Chuppa Chump Avatar asked May 30 '16 15:05

Chuppa Chump


1 Answers

use URLRequest struct.

In Xcode8 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:))
like image 143
quesera2 Avatar answered Oct 05 '22 23:10

quesera2