需要澄清关闭/完成处理程序

时间:2017-08-19 03:37:07

标签: swift alamofire

我一直关注视频教程,并编写了以下代码:

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?

1 个答案:

答案 0 :(得分:1)

Swift闭包定义为:

{ (parameters) -> return_type in
    statements
}

也就是说,括号中的名称是闭包捕获的变量,-> type是可选的返回类型(可选,因为编译器通常可以推断它)。 Alamofire的responseJSON方法捕获DataResponse<Any>参数,您可以根据需要命名,但通常只命名为response。然后,您可以在该闭包内访问它。

此外,您的completed()来电应该在responseJSON来电之内,而不是在外面,否则会立即调用。