【问题标题】:Swift 3: Cannot invoke dataTask with an argument list of type errorSwift 3:无法使用类型错误的参数列表调用 dataTask
【发布时间】:2016-10-12 21:07:15
【问题描述】:

我是 iOS 的初学者。我在网上搜索过,找不到可以解决我问题的答案。 卡住了,不知道该做什么以及如何寻找解决方案。

我正在关注基于 Swift 2 的教程。以下方法显示错误。

func downloadBooks(bookTitle: String) {
    let stringURL = "GET https://www.googleapis.com/books/v1/volumes?q=\(bookTitle)"

    guard let URL = URL(string: stringURL) else {
        print("url problems")
        return
    }

    let urlRequest = NSMutableURLRequest(url: URL)
    let session = URLSession.shared

    let task = session.dataTask(with: urlRequest) { (data: Data?, response: URLResponse?, error: Error?) in

    }

    task.resume()
}

我已经做了 Xcode 建议的所有调整,但没有进一步的提示。

此外,教程中的原始代码部分是这样的:

guard let URL = NSURL(string: stringURL) else {
    print("url problems")
    return
}

然后Xcode建议添加as URL如下:

let urlRequest = NSMutableURLRequest(url: URL as URL)

这两个版本都显示没有错误。那么区别是什么呢?我应该使用哪一个?

非常感谢任何帮助!

【问题讨论】:

  • 网址开头不需要GET
  • @AndyIbanez 真的吗?但它取自教程。那么作者是不是错了?
  • 如果您的 URL 变为 nil,那么是的。无论如何都暗示要获取数据任务。
  • @AndyIbanez 所以我只需要留下 URL 吗?
  • @AndyIbanez 谢谢!

标签: ios swift xcode swift3 xcode8


【解决方案1】:

在 Swift 3 中,编译器需要原生 URLRequest

let urlRequest = URLRequest(url: url) // use a lowercase variable name, URL is a native struct in Swift 3

但是使用您的特定语法,您甚至不需要请求

let task = session.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) in ...

也不是注释

let task = session.dataTask(with: url) { (data, response, error) in ...

【讨论】:

  • 尝试了您的两种解决方案,它们都可以正常工作。那么有什么区别呢?我应该离开哪一个?
  • GET 任务实际上不需要该请求。您需要它用于传递标头和 POST 数据的 POST 任务。所以省略请求。
  • 现在我明白了。谢谢!
  • 抱歉,请再问一个问题。 NSURLURL 有什么区别?也在NSMutableURLRequestURLRequest 之间?
  • Swift 3 使用新类型 URLURLRequest - 以及许多其他不带 NS 前缀的 Foundation 类型 - 它们是结构体,也就是值类型(与 Foundation 对应的类,即类引用类型)。出于性能原因,将许多轻量级类更改为结构是 Swift 哲学的一部分。
猜你喜欢
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多