什么是" let-in"在Swift中阻止意味着什么?

时间:2017-11-26 06:41:12

标签: swift nsurlsession

自学Swift,并查看这个答案here

最令我困惑的是这一点:

let task = URLSession.shared.dataTask(with: request) { data, 
response, error in
    guard let data = data, error == nil else {
        print(error?.localizedDescription ?? "No data")
        return
    }
    let responseJSON = try? JSONSerialization.jsonObject(with: data, 
    options: [])
    if let responseJSON = responseJSON as? [String: Any] {
        print(responseJSON)
    }
}

我会介绍我理解的部分,我希望有人可以帮我填补空白。

  1. let task = ...部分正在使用传入的URLSessionDataTask数据为变量task分配新的request对象。我明白了。
  2. dataresponseerror(后跟in)似乎是占位符参数。它是否正确? in关键字是否表示这些是输入参数?我在Apple的文档中看到它们可以是in-out参数,因此我认为这意味着什么。这种迷你功能可以接受,而不是返回。
  3. guard let data = ...这是来自其他语言的奇怪概念。根据我的理解,guard语句定义了一组Bool /布尔表达式,所有这些都必须为true,否则块内的代码将被执行。所以基本上,如果data无法收到任何内容,并且errornil / null,则会打印错误消息并返回。
  4. 如果其他所有内容都成功,请打印JSON响应并完成。
  5. 我想对我来说最外国的概念是let ... _, _, _ in语句,因为语法看起来很奇怪(占位符参数在开始{之后?)

    我尝试搜索有关此类声明的文档,Apple将其与其他语言的lambda表达式进行了比较。我可以通过data, response, error部分看到它。

    所以,如果有人可以帮忙清楚解决这个问题,那么我们将非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

let ... _, _, _ in这个东西不能用这种形式来讨论,因为它不是单一的语法(比如if语句或while循环),而是一堆不同的东西放在一起。

  • let task声明一个常量,其类型是推断的。
  • URLSession.shared.dataTask(...调用名为URLSession的{​​{1}}类中的方法。其参数是:
    • 使用名为dataTask的变量传递的请求。
    • 一个闭包,取3个参数并且什么都不返回。
  • 由于闭包是最后一个参数,因此可以在此处使用尾随闭包语法。这意味着闭包可以写在括号中的,它应该包含所有参数。这是你传递的闭包:

    request
  • { data, response, error in guard let data = data, error == nil else { print(error?.localizedDescription ?? "No data") return } let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) if let responseJSON = responseJSON as? [String: Any] { print(responseJSON) } 是闭包的参数。同样,推断出它们的类型。

  • 单词data, response, error只是你如何编写一个闭包语法的一部分。可以把它想象成“对,我现在已经完成了编写参数和捕获列表的工作,继续讨论这个封装会做什么!”