.rangeOfString() 带开关 Swift
.rangeOfString() with switch in Swift
我想检查我的输入是否有一个 rangeOfString 必须有很多不同的字符串来检查。
基本上是这个 if 语句,但使用 switch 来检查不同字符串的大列表
if (input.rangeOfString("lol") != nil) {
println("yes")
}
我试过这样做,但没有用。
switch input {
case rangeOfString("lol"):
println("lol")
case rangeOfString("dw"):
println("dw")
default:
println("Default")
}
您误解了 switch
语句的意思。它根据多个可能的值检查一个表达式的值,并可选择让您访问枚举的关联值。它不会让您将单个值传递给列为开关案例*的多个表达式,并选择提供第一个匹配项的那个。
您需要创建一个 if
-else
链才能使您的代码正常工作:
if (input.rangeOfString("lol") != nil) {
println("lol")
} else if (input.rangeOfString("dw") != nil) {
println("dw")
} else {
println("Default")
}
I would like to check if a word is being used in the input and I have like 50 words I'd like to check.
那么switch
也不是一个好的选择。制作一个包含您要搜索的单词的容器,然后使用 filter
查找所有匹配项:
let input = "hahalolblah"
let words = ["lol", "blah", "hello"];
let matches = words.filter {input.rangeOfString([=11=]) != nil}
println(matches) // Produces [lol, blah]
* 事实证明,switch
允许您将一个表达式传递给 ~=
运算符的覆盖,以及来自 [=19 的值=] 的 switch
。有关详细信息,请参阅 。
虽然其他关于 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")
}
这可行,但会是一个坏主意,因为现在您将更改字符串开关的普遍工作方式,以便部分匹配始终为真,这可能会导致代码中其他地方的一些不愉快和意外的行为。
您还可以执行以下操作:
switch true {
case myString.rangeOfString("lol") != nil:
print("lol");
case myString.rangeOfString("dw") != nil:
print("dw");
default:
print("Default")
}
我想检查我的输入是否有一个 rangeOfString 必须有很多不同的字符串来检查。
基本上是这个 if 语句,但使用 switch 来检查不同字符串的大列表
if (input.rangeOfString("lol") != nil) {
println("yes")
}
我试过这样做,但没有用。
switch input {
case rangeOfString("lol"):
println("lol")
case rangeOfString("dw"):
println("dw")
default:
println("Default")
}
您误解了 switch
语句的意思。它根据多个可能的值检查一个表达式的值,并可选择让您访问枚举的关联值。它不会让您将单个值传递给列为开关案例*的多个表达式,并选择提供第一个匹配项的那个。
您需要创建一个 if
-else
链才能使您的代码正常工作:
if (input.rangeOfString("lol") != nil) {
println("lol")
} else if (input.rangeOfString("dw") != nil) {
println("dw")
} else {
println("Default")
}
I would like to check if a word is being used in the input and I have like 50 words I'd like to check.
那么switch
也不是一个好的选择。制作一个包含您要搜索的单词的容器,然后使用 filter
查找所有匹配项:
let input = "hahalolblah"
let words = ["lol", "blah", "hello"];
let matches = words.filter {input.rangeOfString([=11=]) != nil}
println(matches) // Produces [lol, blah]
* 事实证明,switch
允许您将一个表达式传递给 ~=
运算符的覆盖,以及来自 [=19 的值=] 的 switch
。有关详细信息,请参阅
虽然其他关于 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")
}
这可行,但会是一个坏主意,因为现在您将更改字符串开关的普遍工作方式,以便部分匹配始终为真,这可能会导致代码中其他地方的一些不愉快和意外的行为。
您还可以执行以下操作:
switch true {
case myString.rangeOfString("lol") != nil:
print("lol");
case myString.rangeOfString("dw") != nil:
print("dw");
default:
print("Default")
}