Swift: Obtener "expresión ambigua" cuando intenta pasar tupla a la function de callback

Tengo esta class para autenticar a un usuario contra mi backend.

class BackendService { class func performLogin(#email: String, password: String, success:((res: NSHTTPURLResponse, json: JSON, statusCode: HTTPStatus))->(), failure: (NSError)->()) { let loginURL = baseURL + "/login" let parameters = ["email": email, "password": password] Alamofire.request(.POST, loginURL, parameters: parameters).responseJSON { (req, res, json, err) in if(err != nil) { let response = (error: err!) failure(response) } else { if let httpStatus = HTTPStatus(rawValue: res!.statusCode) { let response = (res: res, json: JSON(json!) , statusCode: httpStatus) success(response) } } } } 

En el success(response) estoy recibiendo El Type of expression is ambiguous without more context . ¿Algunas ideas?

¿Hay una forma mejor, más Swifty, para escribir esta class?

La razón por la que no estaba comstackndo era que tenía un set adicional de paréntesis alnetworkingedor de la statement de tupla de éxito. Si los elimina, comstackrá. Aquí hay una versión actualizada de su function con los pocos cambios posibles que comstack.

Debes asegurarte de que tienes definido baseURL alguna parte.

 class func performLogin(#email: String, password: String, success:(res: NSHTTPURLResponse, json: JSON, statusCode: HTTPStatus)->(), failure: (NSError)->()) { let loginURL = baseURL + "/login" let parameters = ["email": email, "password": password] Alamofire.request(.POST, loginURL, parameters: parameters).responseJSON { (req, res, json, err) in if (err != nil) { let response = (error: err!) failure(response) } else { if let httpStatus = HTTPStatus(rawValue: res!.statusCode) { let response = (res: res!, json: JSON(json!), statusCode: httpStatus) success(response) } } } } 

Aquí hay una versión actualizada de su function original que es más limpia, pero aún no es completamente segura. Una buena regla de oro es cuanto más signos de exclamación, más riesgo.

 typealias LoginSuccessHandler = (NSHTTPURLResponse, JSON, HTTPStatus) -> Void typealias LoginFailureHandler = (NSError) -> Void class func performLogin(#email: String, password: String, success: LoginSuccessHandler?, failure: LoginFailureHandler?) { let loginURL = baseURL + "/login" let parameters = ["email": email, "password": password] Alamofire.request(.POST, loginURL, parameters: parameters).responseJSON { request, response, json, error in if let error = error { failure?(error) } else { if let httpStatus = HTTPStatus(rawValue: response!.statusCode) { success?(response!, JSON(json!), httpStatus) } } } } 

Realmente debería echar un vistazo a la impresionante lógica de validation de Alamofire.Request integrada en la class Alamofire.Request . De esta forma, podría eliminar por completo la necesidad de la enumeración de HTTPStatus .

  • public func validate() -> Self
  • public func validate(contentType array: [String]) -> Self
  • public func validate(statusCode array: [Int]) -> Self
  • public func validate(statusCode range: Range<Int>) -> Self
  • public func validate(validation: Validation) -> Self