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

问题描述 投票:0回答:1

我只对来自我的查询的.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
                }
            }

我想只做成功的速记检查,但编译器不允许这样做。

.filter{result in
    return result == .success
}
ios swift enums reactive-programming rx-swift
1个回答
4
投票

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

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 { $0.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约定。

© www.soinside.com 2019 - 2024. All rights reserved.