代码之家  ›  专栏  ›  技术社区  ›  John Montgomery

将“或”逻辑与多个“if case”语句一起使用

  •  6
  • John Montgomery  · 技术社区  · 7 年前

    enum MyEnum {
        case foo, bar(_ prop: Int)
    }
    
    let var1 = MyEnum.foo
    let var2 = MyEnum.bar(1)
    

    如果我想检查一下 变量将一般情况与关联值匹配,我可以使用逗号:

    if case .bar = var1, case .bar = var2 {
        print("both are bar")
    }
    

    但我需要检查一下 任何一个 与案例相匹配,如下所示:

    if case .bar = var1 || case .bar = var2 {
        print("at least one is bar")
    }
    

    然而,这并不适用于编译。有没有另一种方法来写这篇文章来让逻辑工作?

    3 回复  |  直到 7 年前
        1
  •  9
  •   Gereon    7 年前

    我会求助于某种 isBar 属性,以便“a或b”测试保持可读性:

    enum MyEnum {
        case foo, bar(_ prop: Int)
    
        var isBar: Bool {
            switch self {
            case .bar: return true
            default: return false
            }
        }
    }
    
    let var1 = MyEnum.foo
    let var2 = MyEnum.bar(1)
    
    let eitherIsBar = var1.isBar || var2.isBar
    
        2
  •  6
  •   kovpas    7 年前

    extension MyEnum: Equatable {}
    func ==(lhs: MyEnum, rhs: MyEnum) -> Bool {
        switch (lhs, rhs) {
            case (let .bar(prop1), let .bar(prop2)):
                return prop1 == prop2
            case (.foo, .foo):
            return true
    
         default:
             return false
        }
    }
    

    if var1 == .bar(1) || var2 == .bar(1) {
        print("at least one is bar")
    }
    

    UPD:如果您不需要检查关联的值,您可以这样进行模式匹配:

    switch (var1, var2) {
    case (.bar, _), (_, .bar): print("at least one is bar")
    default: break
    }
    
        3
  •  5
  •   aturan23 DairySeeker    5 年前

    我的解决方案是:

    if [var1, var2].contains(.bar) {
    

    很多时候,我希望它是另一种方式,一个可以基于多个值过滤的单一变量:

    if [.bar, .baz].contains(var)
    

    但事实上,如果涉及到关联值,则必须使它们相等并定义运算符。

        4
  •  2
  •   Witek Bobrowski    7 年前

    if case 和 guard case && 运算符以使代码更具可读性。当你使用 && 或 || case .bar = var1 它本身并不完全是一个可以单独存在的表达式,在Swift中没有上下文,因此它不能被视为一个返回bool的表达式。

    总结如下:

    • 如果情况 和 是简单的语法糖,与 if <expression>, <expression> 语法

    • && 和 || 逻辑运算符基本上是一个函数,两边都有两个布尔参数。

    要解决您的问题,请使用好的旧switch语句。 希望能有帮助。