Comprender la rápida ejecución de Alamofire Handler

Tengo estos dos methods en mi class API para get datos de una API:

func authenticateUser(completionHandler: (responseObject: String?, error: NSError?) -> ()) { makeAuthenticateUserCall(completionHandler) } func makeAuthenticateUserCall(completionHandler: (responseObject: String?, error: NSError?) -> ()) { Alamofire.request(.GET, loginUrlString) .authenticate(user: "a", password: "b") .responseString { request, response, responseString, responseError in completionHandler(responseObject: responseString as String!, error: responseError) } } 

Luego, en otra class utilizo el siguiente código para acceder a los datos:

 API().authenticateUser{ (responseObject, error) in println(responseObject) } 

El código funciona, pero no lo entiendo completamente.

  1. func authenticateUser tiene el parámetro completionHandler: (responseObject: String ?, error: NSError?) -> (), ¿es esto una reference al método completionHandler? o es un object ¿Cuál es el propósito de -> ()?
  2. Cuando llamo a la function authenticateUser, ¿cómo accedo realmente a la respuesta? No hay retorno en ninguno de mis funciones api, el nombre de la function {(parámetro, parámetro) en …} la syntax parece realmente extraña.

completionHandler es un parámetro de cierre. Como dice la documentation de Swift:

Los cierres son bloques autónomos de funcionalidad que pueden pasarse y usarse en su código. Los cierres en Swift son similares a los bloques en C y Objective-C ya las lambdas en otros lenguajes de progtwigción.

Entonces, para qué se utiliza un cierre es agregar algunas funciones propias que desee agregar a la ejecución de su function.

En su caso, llama a authenticateUser y pasa un cierre que recibe (responseObject, error) y ejecuta println(responseObject) . authenticateUser() recibe su cierre bajo el parámetro completionHandler y luego llama a makeAuthenticateUserCall() pasando el cierre completionHandler .

Luego, nuevamente, mirando la definición, puede ver func makeAuthenticateUserCall(completionHandler: (responseObject: String?, error: NSError?) -> ()) que significa que al igual que authenticateUser() makeAuthenticateUserCall() es una function que recibe un cierre como un parámetro, bajo el nombre de completionHandler . makeAuthenticateUserCall() hace una request de networking usando AlamoFire y captura nuevamente la respuesta bajo un cierre que pasa como parámetro del método responseString() . Así que tienes:

 //here you call authenticateUser with a closure that prints responseObject API().authenticateUser{ (responseObject, error) in println(responseObject) } 

Entonces:

 //authenticateUser receives your closure as a parameter func authenticateUser(completionHandler: (responseObject: String?, error: NSError?) -> ()) { //it passes your closure to makeAuthenticateUserCall makeAuthenticateUserCall(completionHandler) } //makeAuthenticateUserCall receives your closure func makeAuthenticateUserCall(completionHandler: (responseObject: String?, error: NSError?) -> ()) { Alamofire.request(.GET, loginUrlString) .authenticate(user: "a", password: "b") //here you pass a new closure to the responseString method .responseString { request, response, responseString, responseError in //in this closure body you call your completionHandler closure with the //parameters passed by responseString and your code gets executed //(that in your case just prints the responseObject) completionHandler(responseObject: responseString as String!, error: responseError) } } 

Para más información lea la documentation: Cierres Swift