我想检查我的输入是否有一个rangeOfString,必须要检查很多不同的字符串。
基本上是这个if语句但是使用开关来检查不同字符串的大列表
if (input.rangeOfString("lol") != nil) {
println("yes")
}
我已经尝试过这样做,但它没有用。
switch input {
case rangeOfString("lol"):
println("lol")
case rangeOfString("dw"):
println("dw")
default:
println("Default")
}
答案 0 :(得分:6)
你误解了switch
陈述的想法。它根据多个可能的值检查一个表达式的值,并可选择允许您访问枚举的关联值。 不允许您将单个值传递给列为切换案例 * 的多个表达式,并选择第一个匹配项中的任何一个。
您需要建立一个if
- else
链来使代码正常工作:
if (input.rangeOfString("lol") != nil) {
println("lol")
} else if (input.rangeOfString("dw") != nil) {
println("dw")
} else {
println("Default")
}
我想检查输入中是否使用了一个单词,我想要查看50个单词。
然后switch
也不是一个好的选择。制作您要搜索的单词的容器,并使用filter
查找所有匹配项:
let input = "hahalolblah"
let words = ["lol", "blah", "hello"];
let matches = words.filter {input.rangeOfString($0) != nil}
println(matches) // Produces [lol, blah]
* 事实证明switch
允许您将一个表达式传递给~=
运算符的覆盖,以及来自case
s的值switch
。有关详细信息,请参阅this answer。
答案 1 :(得分:4)
虽然其他答案可能是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")
}
这会起作用,但会是坏主意,因为现在你已经改变了字符串上的开关普遍工作的方式,这样部分匹配总是正确的,这可能会导致一些不愉快和代码中其他地方的意外行为。
答案 2 :(得分:0)
您还可以执行以下操作:
switch true {
case myString.rangeOfString("lol") != nil:
print("lol");
case myString.rangeOfString("dw") != nil:
print("dw");
default:
print("Default")
}