Welcome to Swift (苹果官方Swift文档初译与注解二十五)---171~180页(第四章 流程控制)

For-Condition-Increment (For 循环) 

  除了for-in循环之外,Swift还支持传统C语言的for循环(使用一个条件和一个增量):

    for var index = 0; index < 3; ++index {

        println("index is \(index)")

    }

    // index is 0

    // index is 1

    // index is 2

  这种循环的通用格式是:

    for initialization; condition; increment {

        statements

    }

  分号隔离了循环定义的三个部分(与C语言一样).但与C语言不同的是,Swift不需要使用小括号()来包住“initialization; condition; increment” 这部分块.

  循环执按如下步骤执行:

  1.当第一次进入循环,初始化表达式 initialization被执行一次,用了设置循环中的任意常量或者变量.

  2.计算条件表达式 condition,如果计算结果为false,循环结束,继续执行大括号(})后面的代码,如果计算结果为true,则不断的执行循环体内的语句.

  3.循环体中的语句都执行过后,计算增量表达式 increment,它可能是增加计数值,也可能是减少计数值,或者根据语句给循环体外某一变量设置的新值.增量表达式计算之后,返回到步  骤2,条件表达式再一次的被计算.

  循环的执行过程可以缩写为:

    initialization

    while condition {

        statements

        increment

    }

  值循环中,常量或变量唯一可以定义的地方是在初始化表达式中(例如: var index = 0),为了取得index在循环结束的最后值,必须中循环体开始之前定义index:

     var index: Int

    for index = 0; index < 3; ++index {

        println("index is \(index)")

    }

    // index is 0

    // index is 1

    // index is 2

    println("The loop statements were executed \(index) times")

    // prints "The loop statements were executed 3 times”

  注意,index在循环结束之后的最终值是3,而不是2.最后一次调用的增量表达式++index将index设置为3,这使得index<3结果为false,循环结束.

While Loops (While 循环)

  while循环执行一组语句,直到条件为false.当第一次循环开始之前,不知道循环次数的情况下,while循环是最有效的.Swift提供了两种while循环:

    •   while 在每次循环之前,计算循环的条件
    •       do-while 在每次循环之后,计算循环的条件

While

  while循环是根据单一条件开始的.如果条件是true,一组语句会被反复的执行,直到条件为false.

  while循环的通用格式:

    while condition {

        statements

    }

  下面的例子,演示了一个蛇和梯子(Snakes and Ladders)的简单游戏(也被叫做Chutes and Ladders):/**感觉翻译为蛇梯更准确一点,各位大神请自行替换,嘻嘻,这是编外话^_^*/

 

    

  游戏的规则如下:

  • 场地有25个方格,目标是达到或者越过25号方格.
  • 每次,你投掷一个六面的色子(dice),然后根据上图里由点组成的箭头所指示的水平路径,移动相应的格子.
  • 如果你到了梯子的底部,你将从梯子向上移动.
  • 如果你到了蛇的头部,你将从蛇头向下移动

  游戏的场地可以用一个Int值的数组来表示,它的大小通过常量finalSquare来设置.它(指常量)用了初始化数组,也用来判断获胜的条件.board被初始化为26个Int类型的0,而不是25个:

    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

  方格3在梯子的底部,可以将你移动到方格11.

  为了表明这个, board[03] 等于+08,+08与整数8是等效的,一元加号操作符(+)与一元减号操作符(-)是为了对称性,所有小于10的数值都被添加了0补齐,这是为了定义的方格整齐(虽  然这不是严格要求的,但这样做可以保持代码的干净).

  玩家从零号格子开始,就是整个场地的左下角.第一次投掷的色子(dice)总是从这个方格开始:

    var square = 0

    var diceRoll = 0

    while square < finalSquare {

        // roll the dice

        if ++diceRoll == 7 { diceRoll = 1 }

         // move by the rolled amount

        square += diceRoll

        if square < board.count {

            // if we're still on the board, move up or down for a snake or a ladder

            square += board[square]

        }

    }

    println("Game over!")

  这个例子中使用了非常简单的色子投掷方法,而不是生产随机数.它是以diceRoll等于0开始,每次while循环, diceRoll都会通过前置增量操作符(++i)增加1,然后检查它的值是否过    大,++ diceRoll的返回值等于 diceRoll增加1之后的值.当返回值等于7的时候,说明色子投掷过大,并且重新设置为1.色子值的序列总是1, 2, 3, 4, 5, 6, 1, 2 ..等等.

  投掷色子之后,玩家向前移动diceRoll个方格.色子投掷的结果可能让玩家移动超过25号方格,这时游戏结束.为了限定界限,代码中在给数组board[square]添加值之前,会检查square  小于board的count属性.

  如果不执行检查,board[square]可能会访问越界,这会触发错误.如果square等于26,代码试图访问board[26],这超出了数组的大小.

  while的当前循环执行后,会根据检查循环条件来确定是否再次执行.如果玩家已经移动或者超过25号格子,循环条件为false,游戏结束.

  这个例子是非常适合while循环的.因为在循环开始的时候,游戏的长度是不明确的.相反的,循环结束的条件是清楚的.

 

posted @ 2014-07-03 23:24  老蔡居士  阅读(563)  评论(0编辑  收藏  举报