web-dev-qa-db-ja.com

POSTリクエストin Swift 3devスナップショットは「メンバー '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 Foundationのみを使用した開発スナップショットでカスタムパラメータを使用してSwiftリクエストを正常に作成する方法(どのような状況でも他のサードパーティライブラリを使用できません)

ありがとう!

編集:誰かが私の後にこの質問の複製を書いたことに注意します。ここでの答えはより良いものです。

8
Chuppa Chump

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

Xcode 8.0のリリース以降、URLSession.shared()はメソッドではなくプロパティになるため、URLSession.shared.dataTask(with :);として呼び出す必要があることに注意してください。

2