自学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 = ...
部分正在使用传入的URLSessionDataTask
数据为变量task
分配新的request
对象。我明白了。data
,response
和error
(后跟in
)似乎是占位符参数。它是否正确? in
关键字是否表示这些是输入参数?我在Apple的文档中看到它们可以是in-out
参数,因此我认为这意味着什么。这种迷你功能可以接受,而不是返回。guard let data = ...
这是来自其他语言的奇怪概念。根据我的理解,guard
语句定义了一组Bool
/布尔表达式,所有这些都必须为true,否则块内的代码将被执行。所以基本上,如果data
无法收到任何内容,并且error
为nil
/ null
,则会打印错误消息并返回。我想对我来说最外国的概念是let ... _, _, _ in
语句,因为语法看起来很奇怪(占位符参数在开始{
之后?)
我尝试搜索有关此类声明的文档,Apple将其与其他语言的lambda表达式进行了比较。我可以通过data, response, error
部分看到它。
所以,如果有人可以帮忙清楚解决这个问题,那么我们将非常感激。谢谢!
答案 0 :(得分:1)
let ... _, _, _ in
这个东西不能用这种形式来讨论,因为它不是单一的语法(比如if语句或while循环),而是一堆不同的东西放在一起。
let task
声明一个常量,其类型是推断的。URLSession.shared.dataTask(...
调用名为URLSession
的{{1}}类中的方法。其参数是:
dataTask
的变量传递的请求。由于闭包是最后一个参数,因此可以在此处使用尾随闭包语法。这意味着闭包可以写在括号中的外,它应该包含所有参数。这是你传递的闭包:
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
只是你如何编写一个闭包语法的一部分。可以把它想象成“对,我现在已经完成了编写参数和捕获列表的工作,继续讨论这个封装会做什么!”