Запрос POST в Swift 3 dev snapshot дает "неоднозначную ссылку на элемент" dataTask(with:completionHandler:)"

Я пытаюсь сделать запрос POST в снимке разработки Swift 3, но по какой-то причине вызов NSURLSession.dataTask завершается с ошибкой в заголовке.

вот код, который я использую:

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

ошибка именно:

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

может кто-нибудь сказать мне:

  1. почему он дает мне эту ошибку
  2. как успешно сделать запрос POST с пользовательскими параметрами в последнем снимке Swift development использование только Foundation (я не могу использовать другие сторонние библиотеки ни при каких обстоятельствах)

спасибо!

Edit: я отмечаю, что кто-то написал дубликат этого вопроса после моего. Ответ здесь лучше.

2 ответов


использовать URLRequest структура.

В Xcode8 будет работать нормально:

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

кроме того, причиной этой ошибки является URLSession API имеет тот же метод имени, но каждый принимает другой аргумент .

таким образом, API будет запутан без явного приведения. Я думаю, что это ошибка именования API.

возникла эта проблема, следующий код:

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

обратите внимание, что с Xcode 8.0 release URLSession.shared () становится свойством, а не методом, поэтому вам придется называть его URLSession.общий.dataTask (with:);