代码之家  ›  专栏  ›  技术社区  ›  Alex Stone

iOS RxSwift如何检查结果==.success?

  •  0
  • Alex Stone  · 技术社区  · 6 年前

    .success 从我的查询中得到的类型。

    如何将筛选器设置为仅通过。成功来自 Result<Value> 枚举?

    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
    }
    
    1 回复  |  直到 6 年前
        1
  •  8
  •   Cristik    6 年前

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

    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 }
    

    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)
    

    后一种方法带来的性能好处很小,因为编译器不需要每次都创建另一个闭包,而是使用存储在 发行成功 姓名。尽管它并不完全符合Swift的惯例,即建议添加成员函数而不是自由函数。