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不可复制的