.rangeOfString()与Swift中的开关

use*_*999 6 switch-statement ios swift

我想检查我的输入是否有一个rangeOfString必须要检查很多不同的字符串.

基本上这个if语句,但使用开关来检查不同字符串的大列表

if (input.rangeOfString("lol") != nil) {
    println("yes")
}
Run Code Online (Sandbox Code Playgroud)

我试过这样做但是没有用.

switch input {
case rangeOfString("lol"):
    println("lol")
case rangeOfString("dw"):
    println("dw")
default:
    println("Default")
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

你误解了switch陈述的想法.它根据多个可能的值检查一个表达式的值,并可选择允许您访问枚举的关联值.它不允许您将单个值传递给列为切换案例*的多个表达式,并选择提供第一个匹配项的任何一个.

你需要做的链条if- elses到让你的代码工作:

if (input.rangeOfString("lol") != nil) {
    println("lol")
} else if (input.rangeOfString("dw") != nil) {
    println("dw")
} else {
    println("Default")
}
Run Code Online (Sandbox Code Playgroud)

我想检查输入中是否使用了一个单词,我想要检查50个单词.

那么这switch也不是一个好的选择.制作一个您想要搜索的单词的容器,并用于filter查找所有匹配项:

let input = "hahalolblah"
let words = ["lol", "blah", "hello"];
let matches = words.filter {input.rangeOfString($0) != nil}
println(matches) // Produces [lol, blah]
Run Code Online (Sandbox Code Playgroud)

*事实证明,switch允许您将一个表达式传递给~=运算符的覆盖,以及来自cases的值的值switch.有关详情,请参阅此答案.


Air*_*ity 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")
}
Run Code Online (Sandbox Code Playgroud)

Swift 中的 Switch 语句可以通过重载运算符来扩展~=。例如,它起作用的原因是:

switch 2.5 {
case 0...5: println("between nought and five")
default:    println("not in range")
}
Run Code Online (Sandbox Code Playgroud)

是因为有一个~=运算符的定义可以将任何类型的Comparable类型与区间相匹配:

func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
Run Code Online (Sandbox Code Playgroud)

在这里,通过创建一种新类型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")
}
Run Code Online (Sandbox Code Playgroud)

这可行,但不是一个好主意,因为现在您将更改字符串上开关的普遍工作方式,以便部分匹配始终为真,这可能会导致代码中其他地方出现一些令人不快和意外的行为。

  • 同意,但我觉得有点难过,因为这个问题被如此严厉地拒绝了,因为这是可以做到的...... (3认同)