我在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)
}
}
答案 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)。
这样做是为了在模式匹配之前不进行任何计算。这在某些情况下节省了一些计算时间,但在两个给定的示例中不会产生任何差异。