在 Swift 3 中获取将 NSURLSession 转换为 URLSession 的错误

Getting errors for conversion NSURLSession to URLSession in Swift 3

我尝试在 Swift 3 上转换以下代码:

session.dataTaskWithURL(url! as URL, completionHandler: { (data : NSData?, response : URLResponse?, error : NSError?) -> Void in  

                if error != nil {  
                    callback(items: nil, errorDescription: error!.localizedDescription, placesDetail: [])  
                }  

                if let statusCode = response as? NSHTTPURLResponse {  
                    if statusCode.statusCode != 200 {  
                        callback(items: nil, errorDescription: "Could not continue.  HTTP Status Code was \(statusCode)", placesDetail: [])  
                    }  
                }  

                NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in  
                    callback(items: GooglePlaces.parseFromData(data!), errorDescription: nil, placesDetail: GooglePlaces.arrayPlaces(data!))  
                })  
            }).resume()  

所以我这样做了:

session.dataTask(with: url!) { (data, response, error) -> Void in

                if error != nil {
                    callback(items: nil, errorDescription: error!.localizedDescription, placesDetail: [])
                }

                if let statusCode = response as? NSHTTPURLResponse {
                    if statusCode.statusCode != 200 {
                        callback(items: nil, errorDescription: "Could not continue.  HTTP Status Code was \(statusCode)", placesDetail: [])
                    }
                }

                OperationQueue.main.addOperation {
                    callback(items: GooglePlaces.parseFromData(data!), errorDescription: nil, placesDetail: GooglePlaces.arrayPlaces(data!))
                }
            }

但是有这个错误:

Ambiguous reference to member 'dataTask(with:completionHandler:)'

为什么会出现这个错误?

你只需要在Swift 3

中更改
session.dataTask(with: url!) { (data, response, error) -> Void in

session.dataTask(with: url as URLRequest) {
            data, response, error in

Swift 3

中尝试以下 URLSession 代码
//MARK:- Parsing API here
    public static func getparseMyApi(_ input: String, action:String, completion: @escaping (_ result: String, _ error: NSError?) -> Void) {

        //Main API here
        let is_URL: String = "http://yourURLhere.com"

        let lobj_Request = NSMutableURLRequest(url: URL(string: is_URL)!)
        let session = URLSession.shared

        lobj_Request.httpMethod = "POST"
        lobj_Request.httpBody = input.data(using: String.Encoding.utf8)
        //lobj_Request.addValue("www.cgsapi.com", forHTTPHeaderField: "Host")
        lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
        lobj_Request.addValue(String(input.characters.count), forHTTPHeaderField: "Content-Length")
        lobj_Request.addValue("http://tempuri.org/IService/\(action)", forHTTPHeaderField: "SOAPAction")


        let task = session.dataTask(with: lobj_Request as URLRequest) {
            data, response, error in
            print("Response: \(response)")

            // Checking here Response
        if response != nil {

            let statusCode = (response as! HTTPURLResponse).statusCode
            print("Success: \(statusCode)")

            // Checking here Response Status
        if statusCode == 200 {
            //Handling Data here
            if data?.count > 0 {
              //Do something here with data
              let strData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
                // Finish here Process
                 completion(strData, nil)
            }else{
                //Data nil Condition here
                completion("", error as NSError?)
            }

            //Handling Error here
            if error != nil
            {
                print("Error: " + error.debugDescription)
                completion("", error as NSError?)
            }

          }else{
                //Invalid Status
                print("Error: " + error.debugDescription)
                completion("", error as NSError?)
            }

         }else{
            //Response Nil then handle here
            print("Error: " + error.debugDescription)
            completion("", error as NSError?)
         }

        }
        task.resume()
    }

  //MARK:- String To Dictionary Conversion
    public static func convertStringToDictionary(_ json: String) -> [String: AnyObject]? {
        if let data = json.data(using: String.Encoding.utf8) {
            do{
                let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) as? [String: AnyObject]
                print(json)
                return json
            }catch {
                print(error)
            }
        }
        return nil
    }

您收到此错误是因为在 Swift 3 中他们使用了所有 API 和 URL 而不是 NSURL,因此只需创建 [=12] 的对象=] 而不是 NSURL 并作为 dataTask(with:completionHandler:).

的第一个参数传递
let url = URL(string: stringURL)
//Now this will works for you
session.dataTask(with: url!) { (data, response, error) -> Void in

有关此检查的更多详细信息URLSession 文档。

注:也可以用。

dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask

但是为此您需要创建 URLRequest 对象而不是 NSURLRequest