【问题标题】:Problems with Swift3: cannot understand new syntax [duplicate]Swift3 的问题:无法理解新语法 [重复]
【发布时间】:2017-05-01 03:46:26
【问题描述】:

昨天我更新到 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()
}

我得到了这个错误:

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

请问有人可以帮我改正吗?

【问题讨论】:

  • Xcode 8.2 不会强制你更新到 Swift 3.0,你仍然可以使用 Swift 2.3。但是 Xcode 8.3 会强制你迁移到 Swift 3.x。

标签: xcode swift3 ios10 nsurlsessiondatatask xcode8.2


【解决方案1】:

对于 Swift 3,如果您检查 Apple Documentation,则为 batte,现在 dataTask(with:completionHandler:) 将采用 URLRequest 作为第一个参数,并且 completionHandler 更改为 (Data?, URLResponse?, Error?) -> Void。所以创建URLRequest 的实例而不是NSMutableURLRequest 并更改completionHandler。在带有大部分公共 API 的 Swift 3 中,它们已将 NSError 更改为 Error。所以如果你也使用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 再次感谢
  • @bero 目前 Mac 不可用,明天将为您提供帮助。
  • 好的,没问题,我在等你,非常感谢你的帮助
  • @bero 检查编辑后的答案,了解如何调用此函数。
  • 非常感谢它的工作
猜你喜欢
  • 2017-11-23
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2011-06-04
  • 2013-05-31
相关资源
最近更新 更多