iOS RxSwift如何检查Result == .success?

Ale*_*one 0 enums reactive-programming ios swift rx-swift

我只对.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
                }
            }
Run Code Online (Sandbox Code Playgroud)

我只想对成功进行速记​​检查,但是编译器不允许这样做。

.filter{result in
    return result == .success
}
Run Code Online (Sandbox Code Playgroud)

Cri*_*tik 5

这是一个单线,不像您描述的那么短,但是比开关短:

if case .success = result { return true } else { return false }
Run Code Online (Sandbox Code Playgroud)

关联值枚举需要模式匹配,因此你需要一个if/ switch/ for/ while要做到这一点。

另外,如果您在多个地方使用这种过滤,则可以扩展Result

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

    var isError: Bool {  return !isSuccess  }
}
Run Code Online (Sandbox Code Playgroud)

,并使用以下扩展名:

query.filter { $0.isSuccess }
Run Code Online (Sandbox Code Playgroud)

或功能性方法,其中有isSuccess一个isError全局功能:

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)
Run Code Online (Sandbox Code Playgroud)

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