如何使用Alamofile的标准结果类型,没有成功的类型?

时间:2015-10-14 15:24:47

标签: ios swift swift2 alamofire

我正在尝试将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)")
            }
        }

但我无法创建“空”.SuccessResult<nil>当然给了我一个编译错误。但我没有任何类型可以传递给.Success个案例。有没有人有更好的解决方案来定义.Success上没有类型的另一个结果类型?

2 个答案:

答案 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类型可能更适合您的需求。