【发布时间】:2016-01-12 18:47:15
【问题描述】:
我正在尝试将 Alamofire 的 Result 类型用于自己的 API 回调。 这是我正在使用的结果类型的缩短版本:
public enum Result<Value> {
case Success(Value)
case Failure(NSData?, ErrorType)
}
所以对于我的 API 调用,我在完成块中使用它:
func getUserContent(userId: String, completion: (result: Result<User>) -> Void) {
Alamofire.request(UserRouter.GetUser(userId))
.validate()
.responseJSON { (request, response, result) -> Void in
switch result {
case .Failure(_, let error):
completion(result: .Failure(nil, error))
case .Success(let value):
if let responseDict = value as? [String: AnyObject] {
do {
// synchronous call which parses response and
// creates User struct instance or throws exception
let user = try self.processUserResponse(responseDict)
completion(result: .Success(user))
} catch(let error) {
completion(result: .Failure(nil, error))
}
} else {
completion(result: .Failure(nil, MyAPIError.WrongResponseFormat))
}
}
}
}
我认为它非常适合这里,但有一个问题。我有一些带有完成块的调用,它们应该返回带有 no value 的 .Success 或 .Failure。
例如。 deleteUser 方法应该类似于:
func deleteUser(userId: String, completion: (result: Result<nil>) -> Void) {
// ... do some stuff here
}
所以当我稍后调用它时,我可以这样做:
deleteUser(userId) { (result) -> Void in
switch result {
case .Success:
print("success")
case .Failure(nil, let error):
print("Error: \(error)")
}
}
但我无法创建“空”.Success。 Result<nil> 当然会给我一个编译错误。但是我没有任何类型可以传递给某些.Success 案例。有没有人有更好的解决方案来定义另一个在.Success 上没有类型的结果类型?
【问题讨论】:
标签: ios swift swift2 alamofire