Ios .rangeOfString(),开关处于Swift模式
我想检查我的输入是否有rangeOfString,必须检查许多不同的字符串 基本上是这个if语句,但是使用一个开关来检查不同字符串的大列表Ios .rangeOfString(),开关处于Swift模式,ios,swift,switch-statement,Ios,Swift,Switch Statement,我想检查我的输入是否有rangeOfString,必须检查许多不同的字符串 基本上是这个if语句,但是使用一个开关来检查不同字符串的大列表 if (input.rangeOfString("lol") != nil) { println("yes") } 我试过这样做,但不起作用 switch input { case rangeOfString("lol"): println("lol") case rangeOfString("dw"): println("dw")
if (input.rangeOfString("lol") != nil) {
println("yes")
}
我试过这样做,但不起作用
switch input {
case rangeOfString("lol"):
println("lol")
case rangeOfString("dw"):
println("dw")
default:
println("Default")
}
您误解了
开关
语句的概念。它根据多个可能的值检查一个表达式的值,并允许您访问枚举的关联值。它不允许您将一个值传递给作为switch cases*列出的多个表达式,并选择提供第一个匹配项的表达式
您需要创建一个if
-else
链,以使代码正常工作:
if (input.rangeOfString("lol") != nil) {
println("lol")
} else if (input.rangeOfString("dw") != nil) {
println("dw")
} else {
println("Default")
}
我想检查输入中是否使用了一个单词,我想检查50个单词
那么开关
也不是一个好的选择。将要搜索的单词放入容器中,然后使用过滤器查找所有匹配项:
let input = "hahalolblah"
let words = ["lol", "blah", "hello"];
let matches = words.filter {input.rangeOfString($0) != nil}
println(matches) // Produces [lol, blah]
*结果是开关
允许您将一个表达式传递给~=
运算符的重写,以及来自开关
的大小写
的值。有关详细信息,请参阅。虽然其他答案对可能是正确的,但如果是一种更好的方法,您可以通过英勇地滥用~=
操作符来执行类似操作:
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")
}
这是因为有一个~=
运算符的定义,它将任何类型的可比较的
类型匹配到一个区间:
func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
这会起作用,但不是一个好主意,因为现在您已经改变了字符串上开关的通用工作方式,以便部分匹配始终为真,这可能会导致代码中其他地方出现一些不愉快和意外的行为。您还可以执行以下操作:
switch true {
case myString.rangeOfString("lol") != nil:
print("lol");
case myString.rangeOfString("dw") != nil:
print("dw");
default:
print("Default")
}
我也认为是这样,但不确定。哇,这似乎是一个非常复杂的方法。如果我想检查输入中是否使用了一个单词,我想检查50个单词。if-else语句将是非常大的“它不允许您将单个值传递给多个表达式,并选择提供第一个匹配项的表达式。”公平地说,在Swift中,它有点大,只要您将这些表达式以某种值的形式放置在一起。。。快速开关非常灵活。我喜欢这个。在切换中有50种不同的情况,仍然会非常冗长。我更喜欢在数组上循环:Dagreed,但我觉得有点不好,因为这个问题太难回答了,因为它是可以做到的…@Airspeed Velocity这似乎很有希望!你能再解释一下struct、subset和~=吗,因为它们对我来说是全新的。我也在阅读iOS开发者库中的相关页面,因为据我所知,这也让我可以选择在每个案例中做不同的事情,而不是在每个“词”中做相同的事情。这是一个加号!是的,没错,可以匹配多个字符串。已编辑演示。
switch true {
case myString.rangeOfString("lol") != nil:
print("lol");
case myString.rangeOfString("dw") != nil:
print("dw");
default:
print("Default")
}