【问题标题】:Swift "where" key wordSwift“where”关键词
【发布时间】:2014-08-16 01:08:05
【问题描述】:

免责声明:快速新手

您好,我刚刚开始学习 Swift,并且正在阅读 The Swift Programming Language(Apple 在 WWDC 期间发布的书籍)并且想知道“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."
}

摘自:Apple Inc.“Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

如果有人可以用另一种语言(java、c++、obj-c 等)解释和/或展示等价物,那就太好了。

抱歉,如果有人问过这个问题,我在任何地方都没有看到。

【问题讨论】:

  • 基本语言指南中提供了此信息。 developer.apple.com/library/prerelease/mac/documentation/Swift/…
  • 我认为您提到的语言没有直接的等价物(缺少手动构造 if 语句)。 Scala 在其模式匹配方面也有一些相似之处。
  • 我认为人们不应该否决这个问题,但是@Alex,你真的应该只是阅读文档。
  • @theMonster 这可能是真的,但我仍然认为这是一个公平的问题。大多数人会在立即查阅文档之前搜索他们的问题。此外,文档页面甚至不在谷歌搜索的第一页上,所以即使我被否决了,希望这对其他人有帮助。
  • @Alex 同意了,因为where 已经有很多其他语言,我敢肯定它已经可以谷歌搜索了。也就是说,这仍然是一个非常相关的问题,不应该被否决。

标签: swift switch-statement


【解决方案1】:

Swift 的switch 语句比大多数其他语言中使用的语句更强大。他们不是简单地从一组值中选择,而是使用模式匹配来选择要评估的case。让我们看看您的示例中的每个case

case "celery":

超级简单——这将匹配字符串"celery",仅此而已。

case "cucumber", "watercress":

这种情况将匹配任一字符串"cucumber" 或字符串"watercress"。凉爽的。在其他语言中,您可能需要使用 fallthrough case 来获得这两个。

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

与 Java 和 C 相比,此案例包含两个特定于 Swift switch 语句的概念。第一个是值绑定——该语句的 let x 部分将匹配的值绑定到常量 @987654332 @ 范围为案例主体。

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

default:

在 Swift 中,switch 语句需要耗尽匹配值的所有可能值,因此它们通常以 default: 大小写块结尾来处理之前未匹配的任何值。唯一不会看到这一点的情况是,如果您将 enum 与几个值匹配,因为您可以手动耗尽所有选项。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2021-03-09
    • 1970-01-01
    • 2014-12-17
    • 2016-05-03
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多