考虑以下情况:
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
。
没有发现任何提及它。任何人都知道如何重构这个而不重复第一种情况下的代码?
我现在使用fallthough
但where
子句现在已重复
答案 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)
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:
// ...
但我认为这不好。