ios – .rangeOfString()与Swift中的开关

我想检查我的输入是否有一个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")
}

这可能有用,但这是一个坏主意,因为现在你已经改变了字符串上的开关普遍工作的方式,这样部分匹配总是正确的,这可能会导致代码中其他地方出现一些令人不快和意外的行为.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...