我想检查我的输入是否有一个rangeOfString必须要检查很多不同的字符串.
基本上这个if语句,但使用开关来检查不同字符串的大列表
if (input.rangeOfString("lol") != nil) { println("yes") }
我试过这样做但是没有用.
switch input { case rangeOfString("lol"): println("lol") case rangeOfString("dw"): println("dw") default: println("Default") }
解决方法
虽然其他答案可能是正确的,如果是一个更好的方式,你可以通过英雄滥用〜=运算符做这样的事情:
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") }
这可能有用,但这是一个坏主意,因为现在你已经改变了字符串上的开关普遍工作的方式,这样部分匹配总是正确的,这可能会导致代码中其他地方出现一些令人不快和意外的行为.