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

12,376

Solution 1

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:))

Solution 2

Please note that as of Xcode 8.0 release URLSession.shared() becomes property and not method so you will have to call it as URLSession.shared.dataTask(with:);

Share:
12,376
Chuppa Chump
Author by

Chuppa Chump

Operational IT staff for a Scottish multinational. Most of my interactions across all the Stack Exchange sites involve or are in some way related to computers.

Updated on July 28, 2022

Comments

  • Chuppa Chump
    Chuppa Chump almost 2 years

    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.