【问题标题】:How to use standard result type from Alamofile with no-type Success?如何使用来自 Alamofile 的标准结果类型且无类型 Success?
【发布时间】: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)")
            }
        }

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

【问题讨论】:

    标签: ios swift swift2 alamofire


    【解决方案1】:

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

    【讨论】:

    • 其实我发现func deleteUser(userId: String, completion: (result: Result&lt;Void&gt;) -&gt; Void) 可以满足这个需求
    【解决方案2】:

    @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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多