对Swift Where Clause感到困惑。

时间:2016-02-17 00:22:58

标签: swift

所以我还在学习,但我很难理解这段代码的某些部分:

  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!")

对不起,我确信它很简单,但我不太明白:/

2 个答案:

答案 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时,才会执行此案例。