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