所以我还在学习,但我很难理解这段代码的某些部分:
case let newSquare where newSquare > finalSquare:
// diceRoll will move us beyond the final square, so roll again
continue gameLoop
为什么每次循环时newSquare最终都是27,28和29?
每次newSquare不应为0吗?我已经尝试在循环中打印出newSquare,每次都是27,28,29。
以下是完整的参考代码:
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]
}
}
print("Game over!")
对不起,我确信它很简单,但我不太明白:/
答案 0 :(得分:1)
构造实际上不仅仅是:
switch square + diceRoll {
// ...
case let newSquare where newSquare > finalSquare: // ...
......但是:
switch
(square + diceRoll)
语句评估true
并将其与订单中的所有指定案例进行比较。第一个成为case let newSquare where newSquare > finalSquare
获胜并承担执行控制权。
在这个特定的例子中,(square + diceRoll) > finalSquare
每次newSquare
都会“赢”,这在游戏逻辑方面意味着我们超越了棋盘限制。就地常量where
在这里没有实际用处(即我们无论如何都不使用它的值),并且只是为了能够使用switch-case的newSquare
语句而引入。
临时常量switch
通过所谓的value binding初始化:
顺便说一句,与示例中几乎相同的替代方式是:
switch square + diceRoll { // ... case finalSquare..<Int.max: // ...
大小写可以将它匹配的值绑定到临时常量,以便在案例正文中使用。这称为值绑定,因为这些值“绑定”到案例正文中的临时常量。
case finalSquare
...如前面的finalSquare..<Int.max
将处理我们最终在最终方格上结束的选项,而范围(square + diceRoll)
将仅在之后进行评估,因此仅在{ {1}}大于finalSquare
。
答案 1 :(得分:1)
这是因为当{(1}})条件newSquare
为真时let
成为square + diceRoll
的{{1}}}值。
由于where
为25,因此只有当newSquare > finalSquare
超过25时,才会执行此案例。