鉴于案例在统计上比其他案例更可能,如果将“案例”放在Switch语句中,那么执行会更快吗?
逻辑上应该是这样,但我一直在运行一些基准测试,我看不出太大的区别。 Switch / Case是否是利用“案例”比其他案例更可能的最佳方式?
答案 0 :(得分:2)
测试非常简单:
struct MyInteger {
let value: Int
}
func ~=(a: Int, b: MyInteger) -> Bool {
println("Evaluating pattern \(a)")
return (a == b.value)
}
for i in 0...3 {
let number = MyInteger(value: i)
switch (number) {
case 0:
println("Case 0")
case 1:
println("Case 1")
case 2:
println("Case 2")
default:
println("Default branch")
}
}
输出
Evaluating pattern 0
Case 0
Evaluating pattern 0
Evaluating pattern 1
Case 1
Evaluating pattern 0
Evaluating pattern 1
Evaluating pattern 2
Case 2
Evaluating pattern 0
Evaluating pattern 1
Evaluating pattern 2
Default branch
因此,case
语句的顺序很重要,只有在我们找到一个评估为true
的语句之后才会对它们进行评估。
这也是default
语句必须始终是最后一个的原因(这不是在Java或C等语言中强制执行的,其中switch
只是一个跳转表)。
每个case
都是对模式匹配函数~=
(或更多)的调用。
答案 1 :(得分:0)
这证明了案件按照他们的写作顺序进行评估:
func testing(a : Int)->Int{
println(a)
return a
}
let x = 2
switch x {
case testing(1) :
println("one")
case testing(2) :
println("two")
case testing(3) :
println("three")
case testing(4) :
println("four")
default:
println("Default")
}
打印:
1
2
two
如果您要评估以下情况,请使用关键字fallthrough