Swift中的switch语句允许重复的case值.这个功能还是bug?

Rob*_*man 1 swift

swift switch语句(在Xcode 6.1中测试)允许重复切换值.请参阅下面的代码,编译和运行没有错误.显然,第一个匹配值是执行的情况.后续案例将被忽略.这是一个错误或功能吗?如果是一个功能,它有什么用?

class SwitchTest{

enum E {
  case one, two, three
  }

func test() {
  switchStmt(E.one)  // outputs: "one, two"
  switchStmt(E.two)  // outputs: "one, two"
  switchStmt(E.three) //outputs: "three, two"
}

func switchStmt(e : E)
{
  switch (e){
  case .one, .two:
    println("one, two")
  case .three, .two:
    println("three, two")
  case .one:
    println("one")
  case .two:
    println("two")
  }
}
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 5

如果文档说它做了一件事但它确实做了另一件事,那只是一个错误.文档在这个问题上保持沉默的任何事情在技术上只是实现者和用户之间的分歧.

但是,在这种情况下,文档没有对此事保持沉默,它明确指出(我的重点):

然后,它根据成功匹配的第一个模式执行适当的代码块.

这样的原因可能与C不同,你不仅限于简单的匹配.您可以在case节中提供单个值,单个值列表,范围,元组,绑定,附加子句等where,default如果您尚未捕获该类型的所有可能值,则可以提供强制性情况.

从这个意义上说,这是合乎逻辑的.这只是一个将检查值case按顺序与每个节进行比较并执行第一个匹配的过程,无论它是否与下面的匹配.

在有用性方面,如果您想在顶部指定特定情况并在下面指定更一般的情况,那么顺序性将会派上用场,例如代码:

switch num {
    case 2, 3, 5, 7, 11, 13, 17, 19:
        println("prime, 1 <= x <= 20");
    case 1...20: // don't need 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20
        println("non-prime, 1 <= x <= 20");
    default:
        println("x < 1 or x > 20");
}
Run Code Online (Sandbox Code Playgroud)

通过顺序检查性质和特定于一般情况的流程,您可以简化后面的情况.