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