2016-05-30 9 views
8

Próbuję wykonać żądanie POST w migawce rozwoju Swift 3, ale z jakiegoś powodu wywołanie NSURLSession. dataTask nie powiedzie się z powodu błędu w tytuleŻądanie POST w Swift 3 dev snapshot daje "niejednoznaczne odwołanie do elementu" DataTask (z: completHandler :) '

Oto kod używam.

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

błąd jest dokładnie:

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 

Czy ktoś może mi powiedzieć:

  1. Dlaczego to daje mi ten błąd
  2. Jak skutecznie złożyć żądanie POST z parametrów niestandardowych w najnowszy snapshot rozwoju Swift wykorzystaniem Fundację tylko (nie jestem w stanie korzystać z innych bibliotek innych firm w żadnych okolicznościach)

Dzięki!

Edycja: Zauważam, że ktoś napisał duplikat tego pytania po moim. Odpowiedź jest lepsza.

+0

To jest dziwne, nie widzę powodu, dla którego przekazanie 'NSMutableURLRequest' jest niejednoznaczne. To nie jest podklasa 'NSURL', więc IDK jak mogłoby się wydawać, że może tam wejść. – Alexander

+0

Tak właśnie myślałem. Może się zdarzyć, że jest to błąd, ponieważ jest to migawka rozwoju. –

+0

Możesz spróbować ujednoznacznić to połączenie, przypisując 'dataTaskWithRequest: completionHandler:' do zmiennej z adnotacją typu określającą jej '(NSURL, (NSData ?, NSURLResponse ?, NSError?) -> Swift.Void) -> NSURLSessionDataTask' i następnie wywołanie tego zamknięcia – Alexander

Odpowiedz

23

użyć struktury URLRequest.

W Xcode8 będzie działać prawidłowo:

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

Ponadto, powodem tego błędu jest URLSession API ma tę samą metodę imię, ale każdy podjąć inną tezę.

Tak więc interfejs API będzie zagubiony bez wyraźnej obsady. Myślę, że to jest błąd w nazewnictwie API.

wystąpił ten problem, następujący kod:

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

Należy pamiętać, że z Xcode 8.0 release URLSession.shared() staje się własnością i nie sposób więc trzeba będzie nazwać jako URLSession.shared.dataTask (z:);

Powiązane problemy