Swift 3 dev快照中的POST请求给出了成员&data;数据任务(带有:completionHandler:)'的模糊引用。

时间:2016-05-30 15:17:18

标签: swift macos post nsurlsession

我试图在Swift 3开发快照中发出POST请求,但出于某种原因,对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. 如何使用仅限Foundation的最新Swift开发快照中的自定义参数成功发出POST请求(我无法在任何情况下使用其他第三方库)
  3. 谢谢!

    编辑:我注意到有人在我之后写了这个问题的副本。这里的答案是更好的。

2 个答案:

答案 0 :(得分:23)

使用URLRequest struct。

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

答案 1 :(得分:2)

请注意,从Xcode 8.0开始,URLSession.shared()成为属性而不是方法,因此您必须将其称为URLSession.shared.dataTask(使用:);