首页 > 代码库 > Welcome to Swift (苹果官方Swift文档初译与注解三十)---219~224页(第四章-- 流程控制 完)

Welcome to Swift (苹果官方Swift文档初译与注解三十)---219~224页(第四章-- 流程控制 完)

Labeled Statements  (标签语句)

  循环或者switch语句可以嵌套其他的循环或者switch,这样在Swift中可以创建复杂的流程控制结构.循环或者switch语句都可以通过break语句来永久的结束,因此,有时候需要显式的  表明在循环或者switch中你需要break的语句.同样的,如果你嵌套多个循环,显式的表明里面的continue语句也是类似的.

  为了达成这个目标,可以在循环语句或者switch语句中使用一个语句标签(statement label),利用这个标签和break或continue语句来结束或者继续执行标签的语句.

  一个标签语句的写法是在相同语句行使用label关键字后,再跟一个冒号(:),下面是一个while循环的例子,这个例子对于switch语句和其他所有循环都是相同的规则:

  label name: while condition {

      statements

  }

  下面的例子通过在标记的while循环中使用break和continue语句来实现蛇和梯子游戏的改进版本,并且游戏添加了一个扩展的规则:

  必须到达格子25才获胜.

  如果你投掷色子超过了格子25,你必须重新再投掷直到你准确的到达格子25

  游戏的格子与之前是一样的:

pastedGraphic.pdf

  值finalSquare, board, square, 和diceRoll的初始化也与之前一样:

    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

  这个版本的游戏使用while循环和一个switch语句来完成游戏逻辑.while循环有一个标记语句gameLoop,是为了说明它是游戏的主要循环.

  while循环的条件是while square != finalSquare,这个表示你必须达到格子25:

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

  在每次循环的是时候都投掷色子,而不是立刻移动玩家.switch语句用来处理移动结果并计算移动:

    •   如果投掷色子后,玩家移动到最后的格子,游戏结束.语句break gameLoop语句跳转控制到while循环外的第一行代码,它结束游戏.
    •   如果投掷色子后,玩家移动超过最后的格子,移动不成立,玩家需要再次投掷,continue gameLoop语句结束当前while循环并且开始一次循环遍历.
    •   所有的其他情况,投掷色子移动,玩家向前移动diceRoll个格子,游戏逻辑上检查蛇和梯子,然后循环结束,控制返回到while条件判断,来决定是否进行一下个循环.

  注意点:

  如果break语句没有使用gameLoop标记,它将只跳出switch语句,而不是while语句.使用gameLoop标记可以清晰的表明将要结束的控制语句.

  同时,在调用continue gameLoop语句跳转到下一次循环,使用gameLoop标记并不是严格要求的.游戏中只有一个循环,因此不会continue语句不会有模棱两可的情况.但是使用了    gameLoop标记continue语句依然是无害的.这么做的原因是对比break语句,并且帮助游戏逻辑清晰,增加可读性和易于理解.