我一直关注视频教程,并编写了以下代码:
func downloadWeatherDetails(completed: ()->() ) {
let currentWeatherURL = URL(string: CURRENT_WEATHER_URL)!
Alamofire
.request(currentWeatherURL)
.responseJSON(completionHandler: { response in
let result = response.result
print(result)
})
completed()
}
基本上,我的理解如下。 .responseJSON
处理程序允许您在触发请求后调用代码。它允许您指定completionHandler
,在我的情况下,是闭包:
{ response in
let result = response.result
print(result)
}
然而,我不明白的是“response”关键字实际表示的含义。我研究了闭包的用法,并看到语法是:
{(param) -> returnType in { code here }
那么,“response”关键字是一个参数吗?如果是这样,它是如何声明的以及数据来自何处?数据是如何传递到“响应”对象的?另外,为什么只允许一个参数?如果我按如下方式编写代码,则代码不起作用,例如:
{ (response, test) in
let result = response.result
print(result)
}
我非常感谢对此的详尽解释,因为我在其他地方没有找到任何帮助。我已经阅读了Apple的“The Swift Programming Language”,大量不同的解释和类似的问题,但仍然完全不了解。
为了澄清,我不相信我的问题是重复的,因为我的问题主要围绕存储在
response
中的捕获值,而不是整个闭包的语法。我在试图找出自己的问题时经历了相关问题,但这对我没有帮助。
需要进行细微的澄清:
当一个方法将闭包作为其参数之一时,例如
.testMethod(testParam: (String) -> ())
并且因此在实践中使用时,总是如此:.testMethod(testParam: { (capturedVar) in statements}
(如果我错了,请纠正我),总是这样的情况是闭包的参数(在这种情况下是(String)
)将被捕获并存储在capturedVar
中?是否总会有数据传递到您定义的变量中?或者这个循环特定于alamofire?
答案 0 :(得分:1)
Swift闭包定义为:
{ (parameters) -> return_type in
statements
}
也就是说,括号中的名称是闭包捕获的变量,-> type
是可选的返回类型(可选,因为编译器通常可以推断它)。 Alamofire的responseJSON
方法捕获DataResponse<Any>
参数,您可以根据需要命名,但通常只命名为response
。然后,您可以在该闭包内访问它。
此外,您的completed()
来电应该在responseJSON
来电之内,而不是在外面,否则会立即调用。