Ogr*_*amp 5 ios swift alamofire swift2
我正在尝试重用 Alamofire 的结果类型作为自己的 API 回调。这是我正在使用的结果类型的简化版本:
public enum Result<Value> {
case Success(Value)
case Failure(NSData?, ErrorType)
}
Run Code Online (Sandbox Code Playgroud)
因此,对于我的 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))
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为它非常适合这里,但有一个问题。我有一些带有完成块的调用,这些调用应该返回没有值的 .Success或 .Failure。例如deleteUser方法应该类似于:
func deleteUser(userId: String, completion: (result: Result<nil>) -> Void) {
// ... do some stuff here
}
Run Code Online (Sandbox Code Playgroud)
所以当我稍后调用它时我可以这样做:
deleteUser(userId) { (result) -> Void in
switch result {
case .Success:
print("success")
case .Failure(nil, let error):
print("Error: \(error)")
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法创建“空” .Success。Result<nil>当然给我一个编译错误。但我没有任何类型可以传递给某些.Success案例。有谁有更好的解决方案来定义另一个没有类型的结果类型.Success?
您需要定义自己的Result类型。另请注意,Alamofire 3.0 使用了一种截然不同的Result类型,可能更适合您的需求。
| 归档时间: |
|
| 查看次数: |
1899 次 |
| 最近记录: |