2016-05-30 29 views
8

Sto provando a effettuare una richiesta POST nell'istantanea di sviluppo Swift 3 ma, per qualche motivo, la chiamata a NSURLSession. dataTask non riesce con l'errore nel titoloLa richiesta POST nello snapshot di Swift 3 fornisce "riferimento ambiguo al membro" dataTask (con: completionHandler :) '

Ecco il codice che sto usando:.

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

l'errore è esattamente:

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 

qualcuno può dirmi:

  1. Perché mi sta dando questo errore
  2. Come fare con successo una richiesta POST con parametri personalizzati nel più recente snapshot di sviluppo Swift usando Fondazione solo (non sono in grado di usare altre librerie di terze parti in nessun caso)

Grazie!

Modifica: Ho notato che qualcuno ha scritto un duplicato di questa domanda in seguito al mio. La risposta qui è la migliore.

+0

Questo è strano, non riesco a capire perché passare "NSMutableURLRequest' è ambiguo. Non è una sottoclasse di 'NSURL', quindi IDK penserebbe che potrebbe andare lì dentro. – Alexander

+0

Questo è quello che stavo pensando. Può essere il caso che si tratti di un bug, poiché è lo snapshot di sviluppo. –

+0

Puoi provare a disambiguare questa chiamata assegnando 'dataTaskWithRequest: completionHandler:' a una variabile con un'annotazione di tipo specificando che è '(NSURL, (NSData ?, NSURLResponse?, NSError?) -> Swift.Void) -> NSURLSessionDataTask' e quindi chiama quella chiusura – Alexander

risposta

23

usa URLRequest struct.

In Xcode8 funzionerà bene:

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

Inoltre, la ragione di questo errore è URLSession API ha stesso metodo nome, ma ognuno prendere un argomento diverso.

Quindi, l'API verrà confusa senza il cast esplicito. Penso che questo sia l'errore di denominazione dell'API.

si è verificato questo problema, codice seguente:

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

Si prega di notare che a partire da Xcode 8.0 rilascio URLSession.shared() diventa proprietà e non il metodo in modo da avere a chiamarlo come URLSession.shared.dataTask (con:);