首页 > 代码库 > 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
游戏的格子与之前是一样的:
值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语句,并且帮助游戏逻辑清晰,增加可读性和易于理解.