我正在尝试将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))
}
}
}
}
我认为它非常适合这里,但有一个问题。我有一些带有完成块的调用,它们应该返回。使用无值或失败返回。
例如。 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
上没有类型的另一个结果类型?
答案 0 :(得分:3)
@ogreswamp是对的!您可以使用Void
省略类型要求。类型Void
只是一个空元组,实际上是一个零元素的元组,可以写成()。这是一个例子:
enum Result<T, E: ErrorType> {
case Success(T)
case Failure(E)
init(value: T) {
self = .Success(value)
}
init(error: E) {
self = .Failure(error)
}
}
像
一样使用enum AuthenticationError: ErrorType {
case MissingEmail
case InvalidPassword
}
func signUp(email email: String, password: String) -> Result<Void, AuthenticationError>
您可以返回结果
// Success
return Result(value: ())
// Failure
return Result(error: .InvalidPassword)
最后,检查结果
switch result {
case .Success(_):
print("Request SignUp was sent")
case .Failure(let error):
switch error {
case .InvalidEmail:
print("Invalid email")
default:
break
}
}
答案 1 :(得分:0)
您需要定义自己的Result
类型。另请注意,Alamofire 3.0使用的Result
类型可能更适合您的需求。