在Swift中用AlamoFire创build一个通用的方法

我正在使用AlamoFire进行API调用,并且在我的项目中有这样的东西:

static func login(userName: String, password: String) -> User { let parameters = ["userName": userName , "password": password] let user = User() Alamofire.request(.POST, "myserver.com/login", parameters: parameters, encoding: .JSON) .validate() .responseObject { (response: Response<User, NSError>) in switch response.result { case .Success(let value): user.valueHandle?(value) case .Failure(let error): user.errorHandle?(error) } } return user } 

(请参阅https://stackoverflow.com/a/37949671/406322关于如何使用上面的代码)。

问题是我有很多除了用户以外的对象,只有对象types不同的代码重复,所以我试图创build一个通用的方法,像这样:

 static func sendRequest<T>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T { let response : T Alamofire.request(method, urlString, parameters:parameters) .validate() .responseObject { (response: Response<T, NSError>) in switch response.result { case .Success(let value): response.valueHandle?(value) case .Failure(let error): response.errorHandle?(error) } } return response } 

但斯威夫特抱怨说:

 Cannot convert value of type '(Response<T, NSError>) -> ()' to expected argument type 'Response<_, NSError> -> Void' 

这是我可以做这样的事情:

 User.swift static func login(userName: String, password: String) -> User { let parameters = ["userName": userName, "password": password] return sendRequest<User>(.GET, "http://myserver.com/users", parameters) } 

并在我的调用代码:

 User.login(txtUserName.text!, password: txtPassword.text!) .success { (value) in var user = value as! User //do something with user } .error { (error) in //show error } 

我什么都不对?

你可以使用一个BaseObject来做到这一点:

 class BaseUser: ResponseObjectSerializable { var valueHandle : ((BaseUser)->())? var errorHandle : ((NSError)->())? required init?(response: NSHTTPURLResponse, representation: AnyObject) { } } func sendRequest<T:BaseUser>(method: Alamofire.Method, urlString: String, parameters: [String: AnyObject]?) -> T { let res : T Alamofire.request(method, urlString, parameters:parameters) .validate() .responseObject { (response: Response<T, NSError>) in switch response.result { case .Success(let value): res.valueHandle?(value) case .Failure(let error): res.errorHandle?(error) } } return res } 

class可以容纳句柄,而使用baseobj则不需要使用协议一次又一次地写入