如何在无类型成功的情况下使用 Alamofile 的标准结果类型?

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)

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

cno*_*oon 0

您需要定义自己的Result类型。另请注意,Alamofire 3.0 使用了一种截然不同的Result类型,可能更适合您的需求。

  • 我实际上发现 `func deleteUser(userId: String,completion: (result: Result&lt;Void&gt;) -&gt; Void)` 可以满足这种需求 (2认同)