Swift 需要关于闭包/完成处理程序的澄清吗
我一直在学习视频教程,并编写了以下代码:Swift 需要关于闭包/完成处理程序的澄清吗,swift,alamofire,Swift,Alamofire,我一直在学习视频教程,并编写了以下代码: func downloadWeatherDetails(completed: ()->() ) { let currentWeatherURL = URL(string: CURRENT_WEATHER_URL)! Alamofire .request(currentWeatherURL) .responseJSON(completionHandler: { response in
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)->返回键入{code here}
因此,“response”关键字是一个参数吗?如果是,它是如何声明的,数据从何而来?数据是如何传递到“response”对象的?还有,为什么只允许一个参数?如果我按如下方式创建,则代码不起作用,例如:
{ (response, test) in
let result = response.result
print(result)
}
我真的很希望能对此进行彻底的解释,因为我在网上的其他地方找不到任何帮助。我浏览了苹果的“快速编程语言”,有很多不同的解释,还有类似的问题,但仍然没有完全理解
我只是想澄清一下,我不认为我的问题是重复的,因为我的问题主要围绕response
中存储的捕获值,而不是闭包的整体语法。我在试图找出我自己的问题时,仔细研究了链接的问题,但这对我没有足够的帮助
需要进行小的澄清:
当一个方法将一个闭包作为其参数之一时,例如,.testMethod(testParam:(String)->()
,并因此在实践中被使用:.testMethod(testParam:{(capturedVar)in statements}
(如果我错了请纠正我),那么闭包的参数((字符串)
在这种情况下)将被捕获并存储在capturedVar
中?是否总是有数据传递到您定义的变量中?或者此周期特定于alamofire
Swift关闭定义为:
{ (parameters) -> return_type in
statements
}
也就是说,括号中的名称是闭包捕获的变量,->type
是可选的返回类型(可选,因为编译器通常可以推断它).Alamofire的responseJSON
方法捕获一个DataResponse
参数,您可以根据需要命名该参数,但通常只命名为response
。然后您可以在该闭包内访问该参数
另外,您的
completed()
调用应该在responseJSON
调用内部,而不是外部,否则它会立即被调用。是否有任何方法可以在xcode内查看捕获的闭包参数类型?闭包内的断点将显示捕获变量,但前提是您已经命名了它们(也就是说,没有使用。
或将它们捕获为一个元组)。您也可以通过在Xcode中单击选项来查看任何方法的内联文档,其中应该包括任何闭包参数的签名。因此,按住选项,它会显示:completionHandler:@escaping(DataResponse)->Void)->Self
根据您的解释,DataResponse是存储在response
中的捕获变量(如果我错了,请告诉我),但是->Self
部分的意思是什么?另外,我假设不这样做的原因是{response->return_type in statements
是因为completionHandler
param返回void
,所以不需要return_type
?正如我所说,可以推断返回类型,这在void
的情况下很容易,但在许多其他情况下也可以工作。至于处理程序签名,您的理解是anding是正确的。Self
返回值实际上是整个responseJSON
方法的一部分,而不是闭包。它用于表示方法返回其调用的类类型的值。因此,如果您创建了DataRequest
的子类,它将返回该类型,而不仅仅是DataRequest
。Possi不可复制的