Swift语言中的switch语句,case子句中的执行顺序是什么?
让我们说,我们有以下的伪代码片段:Swift语言中的switch语句,case子句中的执行顺序是什么?
switch some_variable {
case let v where <condition_checking>:
do_something...
}
据我了解,当代码执行进入交换机时,它首先与第一个case语句去(我们只有一个)。然后它检查condition_checking部分,如果它是真的,那么let部分将被执行并且do_something将有机会运行。那是对的吗?
我问这个问题,是因为我看到了下面的代码片段从苹果公司的文件https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html(页面的最后部分):
let finalSquare = 25
var board = [Int](count: finalSquare + 1, repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
gameLoop: while square != finalSquare {
if ++diceRoll == 7 { diceRoll = 1 }
switch square + diceRoll {
case finalSquare:
// diceRoll will move us to the final square, so the game is over
break gameLoop
case let newSquare where newSquare > finalSquare:
// diceRoll will move us beyond the final square, so roll again
continue gameLoop
default:
// this is a valid move, so find out its effect
square += diceRoll
square += board[square]
}
}
println("Game over!")
注意这一说法case let newSquare where newSquare > finalSquare:
,在newSquare
由let
在此case
语句中定义。 where
直接使用newSquare
,看起来let
部分是第一次执行,然后是where
部分。这不是我所了解的。任何人都可以帮助澄清吗?
据我了解,当代码执行进入交换机时,它首先与第一个case语句去(我们只有一个)。然后它检查condition_checking部分,如果它是真的,那么let部分将被执行并且do_something将有机会运行。那是对的吗?
我想你误会了。在此代码:
case let newSquare where newSquare > finalSquare:
执行顺序是:
- 绑定
newSquare
到的square + diceRoll
值。 - 评估
newSquare > finalSquare
- 如果为真,与
newSquare
结合
此行执行块:
case finalSquare:
可以被认为是作为简写:
case let __temp where __temp == finalSquare:
(不创建一个真实的__temp
符号)
首先,代码将匹配expression
与案例pattern
。在这种情况下,它将是let newSquare
它将执行where
条件,该条件被称为guard
表达式。
因此,将代码视为匹配案例模式,然后再使用where条件进行验证。
第一个:匹配案例模式let newSquare
,它将值简单地分配给变量newSquare。
第二:检查guard
表达newSquare > finalSquare
开关情况下,可以任选地含有各 图案之后的保护表达。关键字引入了一个警戒表达式,其中 后跟一个表达式,用于在案例中的某个模式被认为与 控制表达式匹配之前提供附加的 条件。如果存在警戒表达式,则只有在控件 表达式的值与案例模式之一匹配并且警卫 表达式计算结果为true时,才会执行相关案例中的语句 。
谢谢。 “提供**附加**条件”表示它在模式匹配后被评估。令人困惑的是模式匹配部分只是创建一个变量。哈哈我现在很清楚。再次感谢! – 2015-04-03 18:47:41
是的,模式匹配只是简单地分配一个变量是有点令人困惑,但他们这样做是为了始终匹配这种情况(如果第一种情况不符合),然后检查“guard”where子句。这样,如果它与where子句不匹配,它将在匹配案例模式时失败并落入默认情况。 – chrissukhram 2015-04-03 20:08:10
谢谢。非常清楚地解释。令人困惑的是模式匹配部分只是创建一个变量。我现在很清楚。再次感谢! – 2015-04-03 18:48:33