"let-in" 块在 Swift 中意味着什么?

What does a "let-in" block mean in Swift?

自学 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 = ... 部分正在使用传入的 request 数据将新的 URLSessionDataTask 对象分配给变量 task。我明白了。
  2. dataresponseerror(后跟 in)似乎是占位符参数。这个对吗? in 关键字是否表示这些是输入参数?我在 Apple 的文档中读到它们可以是 in-out 参数,所以我认为这就是这个意思。这种迷你函数接受某些东西,而不是 returns。
  3. guard let data = ... 这是一个来自其他语言的奇怪概念。据我了解, guard 语句定义了一组 Bool/boolean 表达式,所有这些都必须为真,否则将执行块内的代码。所以基本上,如果 data 无法收到任何东西,并且如果 errornil/null,则打印一条错误消息和 return.
  4. 如果其他一切都成功,打印 JSON 响应并完成。

我猜对我来说最陌生的概念是 let ... _, _, _ in 语句,因为语法看起来真的很奇怪(占位符参数在开头 { 之后?)

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

因此,如果有人可以帮助解决一些关于此的问题,我们将不胜感激。谢谢!

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

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

    { 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 是闭包的参数。同样,它们的类型被推断出来。

  • in 这个词只是 how-you-write-a-closure 语法的一部分。把它想象成 "right, I'm now done with writing the parameters and capture list, moving on to what this closure's gonna do!"