.rangeOfString()与Swift中的开关

时间:2015-04-13 15:27:16

标签: 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")
default:
    println("Default")
}

3 个答案:

答案 0 :(得分:6)

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

您需要建立一个if - else链来使代码正常工作:

if (input.rangeOfString("lol") != nil) {
    println("lol")
} else if (input.rangeOfString("dw") != nil) {
    println("dw")
} else {
    println("Default")
}
  

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

然后switch也不是一个好的选择。制作您要搜索的单词的容器,并使用filter查找所有匹配项:

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

* 事实证明switch允许您将一个表达式传递给~=运算符的覆盖,以及来自case s的值switch。有关详细信息,请参阅this answer

答案 1 :(得分: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")
}

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")
}

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

答案 2 :(得分:0)

您还可以执行以下操作:

switch true {
case myString.rangeOfString("lol") != nil: 
    print("lol");
case myString.rangeOfString("dw") != nil: 
    print("dw");
default:
    print("Default")
}