zoukankan      html  css  js  c++  java
  • 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循环的.因为在循环开始的时候,游戏的长度是不明确的.相反的,循环结束的条件是清楚的.

  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/caios/p/3823515.html
Copyright © 2011-2022 走看看