Swift中的“where”关键字

24

免责声明:我是Swift初学者

嗨,我刚开始学习Swift并阅读了苹果在WWDC发布的《The Swift Programming Language》一书,想知道'where'关键字是什么。它在以下代码中使用:

let vegetable = "red pepper"
switch vegetable {
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}

摘自:苹果公司。《Swift编程语言》。iBooks。 https://itun.es/us/jEUH0.l

如果有人能解释并/或者展示另一种语言的等效代码(Java、C ++、Obj-C等),那将是很棒的。

如果这已经被问过了,我很抱歉,我没有看到它。


1
这些信息可以在基础语言指南中找到。https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html#//apple_ref/doc/uid/TP40014097-CH9-XID_199 - jtbandes
1
我认为你提到的语言没有直接等价物(除非手动构建if语句)。Scala在其模式匹配中有一些类似的东西。 - Thilo
1
我不认为人们应该将这个问题投票到无人问津,但是,@Alex,你真的应该阅读文档。 - Oxcug
1
@theMonster 这可能是真的,但我仍然认为这是一个公平的问题。大多数人在立即查阅文档之前会先在谷歌上搜索他们所遇到的问题。而且,文档页面甚至不在谷歌搜索的第一页,所以即使我被 downvote 了,希望这能帮助其他人。 - Alex
1
@Alex同意,因为where已经存在于许多其他语言中,我相信它已经可以在谷歌上搜索到了。话虽如此,这仍然是一个非常相关的问题,不应该被投票否决。 - Oxcug
2个回答

53

Swift的switch语句比其他大多数语言中使用的语句更加强大。它们不仅可以从一组值中简单地进行选择,还可以使用模式匹配来选择要评估的哪个case。让我们来看看你示例中的每个case

case "celery":

非常简单 -- 这将匹配字符串 "celery",并且不会匹配其他任何东西。

case "cucumber", "watercress":

这个情况将匹配任意一个字符串"cucumber" 或者"watercress"。酷!在其他语言中,您可能需要使用“fallthrough”来同时获取这两个字符串。

case let x where x.hasSuffix("pepper"):

这个案例包含了两个在Swift的switch语句中与Java和C有所不同的概念。第一个是值绑定,也就是这个语句中的 let x 部分将匹配的值绑定到一个只在该case语句体内生效的常量x

接下来是where子句。这是一个布尔测试,就像if语句一样,所以只有当表达式为true时,case才会匹配成功。在这个例子中,x.hasSuffix("pepper")查看了绑定的值并检查其是否以"pepper"结尾。字符串"red pepper""green pepper""spicy hot pepper"都会匹配成功,但"peppercorns"则不会。

default:

在Swift中,switch语句需要覆盖所有可能匹配的值,因此它们通常以一个default: case块结束,用于处理之前未匹配的任何值。唯一不需要看到这个的情况是当你匹配的是只有少数几个值的enum时,因为你可以手动列举出所有选项。


16

您可以在单个if语句中包含多个可选绑定,并使用where子句检查布尔条件:

if let firstNumber = Int("4"), secondNumber = Int("42") where firstNumber < secondNumber {
    print("\(firstNumber) < \(secondNumber)")
}
// prints "4 < 42

太好了!它提供了一个初始化空间,让条件成为语义化。 - addlistener
8
在Swift 3中,不再像以前那样使用where子句,而是用逗号代替。 - Flimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接