I have this class for authenticating a user against my 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)
}
}
}
}
In success(response) I am getting Type of expression is ambiguous without more context. Any ideas?
Is there a better, more Swifty way, to write this class?
The reason it wasn't compiling was that you had an extra set of parentheses around the success tuple declaration. If you remove them, then it will compile. Here's an updated version of your function with as few of changes as possible that compiles.
You need to make sure you have
baseURLdefined somewhere.
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)
}
}
}
}
Here's an updated version of your original function that is certainly cleaner, but isn't entirely safe yet. A good rule of thumb is the more exclamation marks, the more risk.
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)
}
}
}
}
You should really take a look at @mattt's awesome validation logic built into the Alamofire.Request class. That way you could remove the need for the HTTPStatus enumeration altogether.
public func validate() -> Selfpublic func validate(contentType array: [String]) -> Selfpublic func validate(statusCode array: [Int]) -> Selfpublic func validate(statusCode range: Range<Int>) -> Selfpublic func validate(validation: Validation) -> SelfIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With