Xcode Swift3的问题:无法理解新语法

Xcode Swift3的问题:无法理解新语法,xcode,swift3,ios10,nsurlsessiondatatask,xcode8.2,Xcode,Swift3,Ios10,Nsurlsessiondatatask,Xcode8.2,昨天我更新到Xcode 8.2,这迫使我更新到Swift 3.0语法。在我的应用程序中,我有以下功能: func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) { let request = NSMutableURLRequest(url: targetURL) reque

昨天我更新到Xcode 8.2,这迫使我更新到Swift 3.0语法。在我的应用程序中,我有以下功能:

func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void)
{
    let request = NSMutableURLRequest(url: targetURL)
    request.httpMethod = "GET"

    let sessionConfiguration = URLSessionConfiguration.default

    let Session = URLSession(configuration: sessionConfiguration)

    let tasksession = Session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: NSError?) -> Void in
        if data != nil{
            DispatchQueue.main.async(execute: { () -> Void in
            completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)})
        }
        else
        {
            print("Connection Lost")
        }

    })
    tasksession.resume()
}
我得到这个错误:

无法使用类型为“”的参数列表调用“dataTask”(使用:NSMutableURLRequest,completionHandler:(数据?、URLResponse?、NSError?->Void)的参数列表)


请,有人能帮我纠正一下吗?

对于Swift 3,如果您检查
苹果文档,现在将作为第一个参数,
完成处理程序
更改为
(数据?、URLResponse?、错误?->Void
。因此,请创建
URLRequest
的实例,而不是
NSMutableURLRequest
,并对
completionHandler
进行更改。在使用大多数公共API的Swift 3中,它们已将错误更改为。所以,如果你也使用了
Error
,那就更棒了

func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: Error?) -> Void) {

    let request = URLRequest(url: targetURL)
    request.httpMethod = "GET"

    let sessionConfiguration = URLSessionConfiguration.default

    let Session = URLSession(configuration: sessionConfiguration)

    let tasksession = Session.dataTask(with: request) { data, response, error in
        if data != nil{
            DispatchQueue.main.async {
                completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)
            }
        }
        else
        {
            print("Connection Lost")
            DispatchQueue.main.async {
                completion(data: nil, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)
            }
        }

    }
    tasksession.resume()
}
注意:您需要使用所有可能的方法调用您的
completionHendler
,当您接收
nil
数据时,您还没有调用它。您需要在else块内调用它,并将
nil
作为数据值

编辑:您可以这样调用此函数

self.performGetRequest(url) { (data, status, error) in
    if error != nil {
        print(error?.localizedDescription)
        return
    }
    //Use data here
}

非常感谢@Nirav D对您的帮助,但我还有一个问题,如何调用此函数performGetRequest谢谢again@bero目前Mac不可用,我明天会帮你的。好的,没问题,我在等你,非常感谢你的帮助help@bero查看编辑后的答案,了解如何调用此函数。非常感谢workXcode 8.2不会强制您更新到Swift 3.0,您仍然可以使用Swift 2.3。但Xcode 8.3将迫使您迁移到Swift 3.x。