Swift中的switch函数:case vs. case _ where

时间:2014-07-16 16:37:32

标签: ios swift

我在Swift中遇到切换功能的问题,我不明白为什么下面的第一个代码可以工作,但第二个代码没有。提前感谢您的帮助。

第一个有效的代码:

for i in 1...100 {
    switch (i) {
    case _ where (i % 3 == 0) && (i % 5 == 0):
        println("FizzBuzz")
    case _ where i % 3 == 0:
        println("Fizz")
    case _ where i % 5 == 0:
        println("Buzz")
    default:
        println(i)
    }
}

无效的第二个代码:

for i in 1...100 {
    switch (i) {
    case (i % 3 == 0) && (i % 5 == 0):
        println("FizzBuzz")
    case i % 3 == 0:
        println("Fizz")
    case i % 5 == 0:
        println("Buzz")
    default:
        println(i)
    }
}

2 个答案:

答案 0 :(得分:3)

您的第二个程序使用条件(例如(i % 3 == 0) && (i % 5 == 0)i % 3 == 0)代替表达式模式。在这种情况下,switch语句将尝试将switch表达式的值(即i)与这些“模式”之一的值匹配,这些模式可以是true或{ {1}}。因此,您希望与“条件”匹配的项目将改为false

第一个程序使用缺少的表达式指示符default作为匹配模式,然后使用_常量保护执行。这是在Swift中执行where <guard-expression>语句的正确方法。

答案 1 :(得分:1)

您可以在Swift Programming Language eBook

中找到此语法

case语句中的第一个实体仅用于模式匹配,类似于逻辑编程语言中的head of horn clause。 where语句是发生繁重计算的地方(如horn clause body)。

这样做是为了在模式匹配之前不进行任何计算。这在某些情况下节省了一些计算时间,但在两个给定的示例中不会产生任何差异。