【发布时间】:2016-10-26 01:02:07
【问题描述】:
我正在使用 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,了解我是如何提出上述代码的)。
问题是我有很多除用户之外的对象,并且代码重复只是对象的类型不同,所以我试图创建一个通用方法,如下所示:
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
}
我做错了什么?
【问题讨论】:
-
@AMomchilov 是的,但我在这里所做的是将其包装更高一级,因此响应处理程序被发送回我的调用代码(如 javascript 承诺)。
-
@AMomchilov 我编辑了我的问题以澄清
标签: ios swift swift2 alamofire