The POST request in the Swift 3 dev snapshot gives "an ambiguous reference to the participant's dataTask" (using: completHandler :) "

I am trying to make a POST request in a Swift 3 development snapshot, but for some reason the NSURLSession.dataTask call failed with a header error.

Here is the code I'm 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() 

Error in accuracy:

 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:

  • Why does this give me this error.
  • How to successfully make a POST request with custom parameters in the last Swift development snapshot using only Foundation (I cannot use other third-party libraries under any circumstances)

Thanks!

Edit: I note that someone wrote a duplicate of this question after mine. The answer here is the best.

+8
post swift nsurlsession macos
source share
2 answers

use URLRequest struct.

On Xcode8 it 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() 

Also, the reason for this error is that the URLSession API has the same name method, but each one takes a different argument.

So, the API will be confused without an explicit cast. I think this is an API naming error.

This problem occurred, following the code:

 let sel = #selector(URLSession.dataTask(with:completionHandler:)) 
+23
source share

Please note: starting from version Xcode 8.0 URLSession.shared () becomes a property, not a method, so you have to call it URLSession.shared.dataTask (with :);

+2
source share

All Articles