Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios .rangeOfString(),开关处于Swift模式_Ios_Swift_Switch Statement - Fatal编程技术网

Ios .rangeOfString(),开关处于Swift模式

Ios .rangeOfString(),开关处于Swift模式,ios,swift,switch-statement,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")

我想检查我的输入是否有rangeOfString,必须检查许多不同的字符串

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

if (input.rangeOfString("lol") != nil) {
    println("yes")
}
我试过这样做,但不起作用

switch input {
case rangeOfString("lol"):
    println("lol")
case rangeOfString("dw"):
    println("dw")
default:
    println("Default")
}

您误解了
开关
语句的概念。它根据多个可能的值检查一个表达式的值,并允许您访问枚举的关联值。它不允许您将一个值传递给作为switch cases*列出的多个表达式,并选择提供第一个匹配项的表达式

您需要创建一个
if
-
else
链,以使代码正常工作:

if (input.rangeOfString("lol") != nil) {
    println("lol")
} else if (input.rangeOfString("dw") != nil) {
    println("dw")
} else {
    println("Default")
}
我想检查输入中是否使用了一个单词,我想检查50个单词

那么
开关
也不是一个好的选择。将要搜索的单词放入容器中,然后使用
过滤器
查找所有匹配项:

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

*结果是
开关
允许您将一个表达式传递给
~=
运算符的重写,以及来自
开关
大小写
的值。有关详细信息,请参阅。

虽然其他答案对
可能是正确的,但如果
是一种更好的方法,您可以通过英勇地滥用
~=
操作符来执行类似操作:

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")
}
这是因为有一个
~=
运算符的定义,它将任何类型的
可比较的
类型匹配到一个区间:

func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool

这会起作用,但不是一个好主意,因为现在您已经改变了字符串上开关的通用工作方式,以便部分匹配始终为真,这可能会导致代码中其他地方出现一些不愉快和意外的行为。

您还可以执行以下操作:

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

我也认为是这样,但不确定。哇,这似乎是一个非常复杂的方法。如果我想检查输入中是否使用了一个单词,我想检查50个单词。if-else语句将是非常大的“它不允许您将单个值传递给多个表达式,并选择提供第一个匹配项的表达式。”公平地说,在Swift中,它有点大,只要您将这些表达式以某种值的形式放置在一起。。。快速开关非常灵活。我喜欢这个。在切换中有50种不同的情况,仍然会非常冗长。我更喜欢在数组上循环:Dagreed,但我觉得有点不好,因为这个问题太难回答了,因为它是可以做到的…@Airspeed Velocity这似乎很有希望!你能再解释一下struct、subset和~=吗,因为它们对我来说是全新的。我也在阅读iOS开发者库中的相关页面,因为据我所知,这也让我可以选择在每个案例中做不同的事情,而不是在每个“词”中做相同的事情。这是一个加号!是的,没错,可以匹配多个字符串。已编辑演示。
switch true {
case myString.rangeOfString("lol") != nil: 
    print("lol");
case myString.rangeOfString("dw") != nil: 
    print("dw");
default:
    print("Default")
}