Switch语句忽略多个案例的Where子句

时间:2015-05-28 07:58:50

标签: swift switch-statement

考虑以下情况:

enum XYZ {
  case X
  case Y
  case Z
}

let x = XYZ.X

switch x {
case .X, .Y where false:
  println("x or y")
case .Z:
  println("z")
default:
  println("default")
  break
}

即使where条款为false,此代码段也会打印x or y

没有发现任何提及它。任何人都知道如何重构这个而不重复第一种情况下的代码?

我现在使用fallthoughwhere子句现在已重复

3 个答案:

答案 0 :(得分:5)

警卫where CONDITION仅绑定到.Y

case .X where false, .Y where false:

答案 1 :(得分:3)

那是因为它匹配.X案例

基本上你的开关是这样的:

switch x {
case .X:
    println("x or y") // This is true, and that's why it prints 
case  .Y where false:
    println("x or y") // This never gets executed
case .Z:
    println("z")
default:
    println("default")
    break
}

要将它们放在同一个case中,您可能需要执行以下操作:

let x = XYZ.X

var condition = false
if x == .X || x == .Y {
    condition = true
}

switch x {
case _ where condition:
    println("x or y")
case .Z:
    println("z")
default:
    println("default")
    break
}

答案 2 :(得分:1)

The grammer of a case label是:

  

case-label case case-item-list :
   case-item-list pattern guard-clause opt | pattern guard-clause opt ­, case-item-list

我们必须为每个“模式”编写“guard-clause”。

如果您愿意,您可以:

let condition:Bool = ...

switch x {
case let x where (x == .X || x == .Y) && condition:
    // ...

但我认为这不好。