iOS RxSwift 如何检查 Result == .success 是否成功?

iOS RxSwift how to check if Result == .success?

我只对来自我的查询的 .success 类型的结果感兴趣。

如何将过滤器设置为仅通过 Result<Value> 枚举的 .success 结果?

public enum Result<Value> {
    case success(Value)
    case failure(Error)
}


query.filter{ (result: Result<Double>) in
                switch result {
                case .success:
                    return true
                case .failure:
                    return false
                }
            }

我只想shorthand检查是否成功,但编译器不允许这样做。

.filter{result in
    return result == .success
}

这是一条线,没有你描述的那么短,但比开关短:

if case .success = result { return true } else { return false }

具有关联值的枚举需要模式匹配,因此您需要 if/switch/for/while 来实现。

或者,如果您在多个地方使用这种过滤,您可以扩展 Result:

extension Result {
    var isSuccess: Bool { if case .success = self { return true } else { return false } }

    var isError: Bool {  return !isSuccess  }
}

,并使用此扩展名:

query.filter { [=12=].isSuccess }

或者函数式方法,其中 isSuccessisError 是全局函数:

func isSuccess<T>(_ result: Result<T>) -> Bool {
    if case .success = result { return true } else { return false }
}

func isError<T>(_ result: Result<T>) -> Bool {
    return !isSuccess(result)
}

// later in the code
query.filter(isSuccess)

后一种方法具有较小的性能优势,因为编译器不需要每次都创建另一个闭包,并且将使用存储在 isSuccess 名称下的闭包。尽管它不完全符合建议添加成​​员函数而不是免费成员函数的 Swift 约定。