虽然其他人的答案可能是关于 if 是一种更好的方法,但您可以通过英勇滥用 ~= 运算符来做这样的事情:
import Foundation
struct Substring {
let substr: String
init(_ substr: String) { self.substr = substr }
}
func ~=(substr: Substring, str: String) -> Bool {
return str.rangeOfString(substr.substr) != nil
}
let input = "contains wat"
switch input {
case Substring("lol"), Substring("wat"):
println("huh?") // this one is picked
case Substring("dw"):
println("dw")
// you can also mix and match
case "Explicit full string":
println("matches whole string")
default:
println("Default")
}
Swift 中的 Switch 语句可以通过 ~= 运算符的重载来扩展。因此,例如,它起作用的原因:
switch 2.5 {
case 0...5: println("between nought and five")
default: println("not in range")
}
是因为~= 运算符的定义可以将任何类型的Comparable 类型匹配到一个区间:
func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
在这里,通过创建Substring 的新类型,我创建了一种将字符串与子字符串匹配的方法。
理论上您可以跳过Substring 类型的创建并执行以下操作:
func ~=(substr: String, str: String) -> Bool {
return str.rangeOfString(str) != nil
}
let input = "contains lol"
switch input {
case "lol":
println("lol")
case "dw":
println("dw")
default:
println("Default")
}
这可行,但会是一个坏主意,因为现在您将更改字符串开关的通用工作方式,以便部分匹配始终为真,这可能会导致一些不愉快和意外代码中其他地方的行为。