Swift提供了所有c类语言的控制流结构。包括for和while循环来执行一个任务多次;if和switch语句来执行确定的条件下不同的分支的代码;break和continue关键字能将运行流程转到你代码的另一个点上。
除了C语言传统的for-condition-increment循环,Swift加入了for-in循环,能更加容易的遍历arrays, dictionaries, ranges, strings等其他序列类型。
Swift的switch语句也比C语言的要强大很多。 Swift中switch语句的case语句不会“掉入”下一个case,避免了c语言忘记写break语句产生的错误。 case可以匹配许多不同的模式,包括范围匹配,元组匹配或者抛给指定的类型。匹配值在一个case条件下可以绑定到临时常量或变量,可以在case的代码块中使用,复杂匹配条件下可以表示为每一个case的条件
一、For Loops - For循环
for循环用来多次执行一组语句 ,Swift提供了两种形式:
1.for-in执行范围,序列,集合或级数等每一项中的一组语句
2.for-condition-increment执行一组语句直到确定的条件出现,通常在每一个循环结束前递增一个计数
For-In循环
使用for-in来遍历集合中的项目,比如数组的范围,排列中的项或者字符串中的字符。
下面的例子打印了表中的5个元素
除了排列和字典,for-in循环还能迭代字符串中的Character(字符):
Continue
Continue语句告诉循环体终止现在的操作,然后开始迭代下一个循环。好像在说“我这次迭代做完啦”,总之不会离开循环体。
下面例子中从一个小写字符串中移除了所有的元音和空格,创建了个字谜短语:
Break
Break语句能立即终止整个控制流。可以根据你想要的在switch或循环语句里的任何地方终止整个执行。
Break in a Loop Statement - 循环中的Break
当在循环体中使用break,循环会立即停止,并将控制流带到循环体括号(})后方的第一行代码里。循环体里其他的代码不会被执行,也不会开始下一次迭代。
Break in a Switch Statement - Switch中的break
在switch里使用break,switch语句会立即终止,并将控制流带到switch语句括号(})后方的第一行代码里。
这种特性可以用于switch里匹配(或忽略)一个或多个case。因为Swift的switch是穷举的,并且不允许有空case的,有时候要慎重的匹配和为了使意图明显而忽略了case。当switch匹配了break语句,case中的break能直接终止整个switch。
下面的例子中switch有一个字符值,并且判断四种语言之一中是否有数字符号。一个简单的switch中包含了多个值:
在switch语句执行完成后,例子里用了可选型绑定来确定值是否被发现。possibleIntegerValue变量有一个隐性的初始值nil,具有可选型的优点。只有在前四个case中,当possibleIntegerValue被赋了实际的值可选绑定才会成功。
在上面例子中列出所有可能的字符值不太实际,所以default能提供一个没任何字符被选中情况下的容器。这的default不用执行任何操作,只写个简单的break。一旦default被匹配,break语句立即终止switch,并继续执行 if let语句。
Fallthrough
Swift中的Switch不会掉下到case的下方并进入下一个case。因此,整个switch语句毁在第一个匹配的case完成后结束。相反,C语言要求你在每个case的末尾插入一个break来防止掉入。相比于C语言,Swift的switch禁止默认掉入让更加简洁和可控,这样避免了执行多个case的错误。
如果你确实需要C式的掉入特性,你可以使用fallthrough关键词。下面的例子用fallthrough来创建一段描述数字的文本:
如果integerToDescribe不跟素数表中任何一项匹配,那根本就不会匹配switch的第一个case。这里面没有其他的case,因此integerToDescribe直接进入default容器。
在switch执行完成后,数字的描述用println函数打印出来。在本例中,5是正确的答案。
Labeled Statements - 标签语句
你可以嵌套循环或在switch语句中嵌套其他的循环,Swift语句种的switch可以创建复杂的控制流结构。 然而,循环和switch语句都可以过早地使用break。因此,有时明确的使用break来终止代码很有用。类似的,如果你有多个嵌套的循环,continue会更有用。
为了做到这一点,你可以用statement label来标记循环或switch,与break或continue语句一起使用这个标签来终止或继续标记语句的执行。
标签语句作为引导关键词在标签的同一行,后面跟着冒号“:”。 这里有一个用了该符号的while循环例子,所有的循环和switch都是相同的。
下面的例子里有一个用了标签的while循环,使用了break和continue语句,Snakes and Ladders游戏可以在上文中看到:
为了胜利,你必须恰好到达25号方块
如果骰子带你超过了25号方块,你必须重新丢骰子直到正好抵达25号方块。
游戏板和上文中的一样
变量 finalSquare, board, square, diceRoll的初始化都跟前文一样:
这个版本用while循环和switch语句来实现游戏逻辑。While循环的标签为gameLoop,为Snakes and Ladders Game标记出游戏主体。
While循环的条件是while square != finalSquare,意思是你必须落在25号方块上:
骰子在每个循环的最开始摇动。然后玩家立即移动,switch语句用来判断移动的结果,算出是否允许移动:
如果骰子带玩家抵达最后的方块,游戏结束。break gameLoop语句将控制流带到游戏结束的地方,即while循环外的第一行。
如果骰子超过了最后的方块,则移动无效,玩家需要再次投骰。break gameLoop会终止本次迭代,开始下次迭代。
在其他的情况下,骰子有效。玩家向前移动方块并根据游戏逻辑检查蛇或梯子。循环结束,控制流返回到while条件判断处,决定是否需要再次迭代。
NOTE 如果上面的break语句不使用gameLoop标签,将会中断switch语句,而不是while语句。使用gameLoop标签可以更加明确的让控制流终止。
同样要注意,当调用continue gameLoop来跳到下一个迭代循环中不是必须使用gameLoop标签。因为这里只有一个循环体,不会受到其他循环体的影响。然而,用了gameLoop标签也没什么不好。这样做保持与break旁边的标签统一,有助于让游戏逻辑能更加清晰阅读和理解。
本文地址:https://www.stayed.cn/item/5897
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我