【问题标题】:URLSession instance method `downloadTask` errorURLSession 实例方法`downloadTask` 错误
【发布时间】:2017-02-16 02:09:31
【问题描述】:

我已将 Advanced NSOperations 示例应用程序更新到 Swift 3。唯一剩余的构建错误是来自 DownloadEarthquakesOperation 类的代码的这个 sn-p。

    let url = URL(string: "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson")!

    let task = URLSession.shared.downloadTask(with: url) { (url, response, error) in
        self.downloadFinished(url, response: response, error: error)
    }

错误显示:

不能使用类型为 '( 的参数列表: URL, (URL?, URLResponse?, Error?) -> Void)'

需要一个类型为'的参数列表(带有:URL,completionHandler: @escaping (URL?, URLResponse?, Error?) -> Void)'

这个错误对我来说没有任何意义,因为@escaping 属性不应该影响调用站点。 有什么想法吗?

【问题讨论】:

  • 这看起来很奇怪。如果您尝试不使用尾随闭包语法会怎样? IE。添加completionHandler: 标签并将其移动到 )
  • @DaveWeston 试过了。还是没有运气。

标签: ios swift swift3


【解决方案1】:

单行闭包通常会导致问题,因为编译器试图从闭包中的一行返回的任何内容推断闭包的返回类型。理论上它应该能够推断出正确的类型(因为downloadFinished 返回Void),但是在AdvancedNSOperations 的初始转换过程中似乎存在很多问题,以至于它只是变得混乱。您可以通过添加明确的 return 语句来消除该警告:

let url = URL(string: "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson")!

let task = URLSession.shared.downloadTask(with: url) { url, response, error in
    self.downloadFinished(url, response: response, error: error)
    return
}

坦率地说,一旦我完成了转换(修复了所有其他问题),我就可以返回并删除那个 return 语句,这不再是一个问题。

【讨论】:

    【解决方案2】:

    Swift 3 中尝试一下:

    let url = URL(string: "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.geojson")!
    
    URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
        if error != nil {
            print(error!)
            return
        }
        // dosomething here
        print(data)
    
    }).resume()
    

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 2017-03-13
      • 1970-01-01
      • 2011-12-13
      • 2018-08-14
      相关资源
      最近更新 更多