源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Swift流程控制之循环语句和判断语句详解

  • 时间:2022-09-15 07:44 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Swift流程控制之循环语句和判断语句详解
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的条件 [b]一、For Loops - For循环[/b] for循环用来多次执行一组语句 ,Swift提供了两种形式: 1.for-in执行范围,序列,集合或级数等每一项中的一组语句 2.for-condition-increment执行一组语句直到确定的条件出现,通常在每一个循环结束前递增一个计数 [b]For-In循环[/b] 使用for-in来遍历集合中的项目,比如数组的范围,排列中的项或者字符串中的字符。 下面的例子打印了表中的5个元素
[url=https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-XID_133]Collection Types[/url]章节。 除了排列和字典,for-in循环还能迭代字符串中的Character(字符):
[url=https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-XID_204]Functions[/url]中描述。 [b]Continue[/b] Continue语句告诉循环体终止现在的操作,然后开始迭代下一个循环。好像在说“我这次迭代做完啦”,总之不会离开循环体。
[u]复制代码[/u] 代码如下:
NOTE: 在for-condition-increment循环中,调用了continue后累加器依旧会计算。循环会继续像平时一样工作,只有循环体中的代码会被跳过。
下面例子中从一个小写字符串中移除了所有的元音和空格,创建了个字谜短语:
[u]复制代码[/u] 代码如下:
let puzzleInput = "great minds think alike" var puzzleOutput = "" for character in puzzleInput {     switch character {     case "a", "e", "i", "o", "u", " ":         continue     default:         puzzleOutput += character     } } println(puzzleOutput) // prints "grtmndsthnklk"
上面代码里,只要匹配到元音字母或空格,就会触发continue关键字。使本次迭代立即终止,然后直接跳入下次迭代的开头。这个方式使得switch代码块能匹配(和忽略)元音字母与空格,比用代码块把每一个要打印字符都匹配一次的好。 [b]Break[/b] Break语句能立即终止整个控制流。可以根据你想要的在switch或循环语句里的任何地方终止整个执行。 [b]Break in a Loop Statement - 循环中的Break[/b] 当在循环体中使用break,循环会立即停止,并将控制流带到循环体括号(})后方的第一行代码里。循环体里其他的代码不会被执行,也不会开始下一次迭代。 [b]Break in a Switch Statement - Switch中的break[/b] 在switch里使用break,switch语句会立即终止,并将控制流带到switch语句括号(})后方的第一行代码里。 这种特性可以用于switch里匹配(或忽略)一个或多个case。因为Swift的switch是穷举的,并且不允许有空case的,有时候要慎重的匹配和为了使意图明显而忽略了case。当switch匹配了break语句,case中的break能直接终止整个switch。
[u]复制代码[/u] 代码如下:
NOTE: 一个switch的case只能包含一个作为编译错误的注释。注释不是语句,不会导致switch的case被忽略。只能使用break语句来跳过case。
下面的例子中switch有一个字符值,并且判断四种语言之一中是否有数字符号。一个简单的switch中包含了多个值:
[u]复制代码[/u] 代码如下:
let numberSymbol: Character = "三"  // Simplified Chinese for the number 3 var possibleIntegerValue: Int? switch numberSymbol { case "1", "١", "一", "๑":     possibleIntegerValue = 1 case "2", "٢", "二", "๒":     possibleIntegerValue = 2 case "3", "٣", "三", "๓":     possibleIntegerValue = 3 case "4", "٤", "四", "๔":     possibleIntegerValue = 4 default:     break } if let integerValue = possibleIntegerValue {     println("The integer value of \(numberSymbol) is \(integerValue).") } else {     println("An integer value could not be found for \(numberSymbol).") }     // prints "The integer value of 三 is 3."
例子中通过检查numberSymbol判断是否是拉丁语,阿拉伯语,中文或者泰文符号来得到1至4的数字。如果匹配成功,其中的一个case里会赋给可选型Int变量possibleIntegerValue一个合适的整型值。 在switch语句执行完成后,例子里用了可选型绑定来确定值是否被发现。possibleIntegerValue变量有一个隐性的初始值nil,具有可选型的优点。只有在前四个case中,当possibleIntegerValue被赋了实际的值可选绑定才会成功。 在上面例子中列出所有可能的字符值不太实际,所以default能提供一个没任何字符被选中情况下的容器。这的default不用执行任何操作,只写个简单的break。一旦default被匹配,break语句立即终止switch,并继续执行 if let语句。 [b]Fallthrough[/b] Swift中的Switch不会掉下到case的下方并进入下一个case。因此,整个switch语句毁在第一个匹配的case完成后结束。相反,C语言要求你在每个case的末尾插入一个break来防止掉入。相比于C语言,Swift的switch禁止默认掉入让更加简洁和可控,这样避免了执行多个case的错误。 如果你确实需要C式的掉入特性,你可以使用fallthrough关键词。下面的例子用fallthrough来创建一段描述数字的文本:
[u]复制代码[/u] 代码如下:
let integerToDescribe = 5 var description = "The number \(integerToDescribe) is" switch integerToDescribe { case 2, 3, 5, 7, 11, 13, 17, 19:     description += " a prime number, and also"     fallthrough default:     description += " an integer." } println(description) // prints "The number 5 is a prime number, and also an integer."
例子中声明了一个名为description的String型变量并分派一个初始值。然后函数用switch匹配integerToDescribe的值。如果integerToDescribe的值符合素数列表中的一项,最后的description会增加一段字符,注意数字都是素数。然后用fallthrough关键字让代码“掉到”default里。default的代码中再额外的给字符串添加些描述,最后switch结束。 如果integerToDescribe不跟素数表中任何一项匹配,那根本就不会匹配switch的第一个case。这里面没有其他的case,因此integerToDescribe直接进入default容器。 在switch执行完成后,数字的描述用println函数打印出来。在本例中,5是正确的答案。
[u]复制代码[/u] 代码如下:
NOTE: fallthrough关键字不检查case里的条件,会直接掉入下一个case。fallthrough简单的让代码执行到下一个case(或default)的代码块中,和标准C语言的特性一样。
[b]Labeled Statements - 标签语句[/b] 你可以嵌套循环或在switch语句中嵌套其他的循环,Swift语句种的switch可以创建复杂的控制流结构。 然而,循环和switch语句都可以过早地使用break。因此,有时明确的使用break来终止代码很有用。类似的,如果你有多个嵌套的循环,continue会更有用。 为了做到这一点,你可以用statement label来标记循环或switch,与break或continue语句一起使用这个标签来终止或继续标记语句的执行。 标签语句作为引导关键词在标签的同一行,后面跟着冒号“:”。 这里有一个用了该符号的while循环例子,所有的循环和switch都是相同的。
[u]复制代码[/u] 代码如下:
<label name>: while <condition> {     <statements> }
下面的例子里有一个用了标签的while循环,使用了break和continue语句,Snakes and Ladders游戏可以在上文中看到: 为了胜利,你必须恰好到达25号方块 如果骰子带你超过了25号方块,你必须重新丢骰子直到正好抵达25号方块。 游戏板和上文中的一样 [img]http://files.jb51.net/file_images/article/201407/2014721115459810.png?201462111557[/img] 变量 finalSquare, board, square, diceRoll的初始化都跟前文一样:
[u]复制代码[/u] 代码如下:
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,为Snakes and Ladders Game标记出游戏主体。 While循环的条件是while square != finalSquare,意思是你必须落在25号方块上:
[u]复制代码[/u] 代码如下:
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循环外的第一行。 如果骰子超过了最后的方块,则移动无效,玩家需要再次投骰。break gameLoop会终止本次迭代,开始下次迭代。 在其他的情况下,骰子有效。玩家向前移动方块并根据游戏逻辑检查蛇或梯子。循环结束,控制流返回到while条件判断处,决定是否需要再次迭代。 NOTE 如果上面的break语句不使用gameLoop标签,将会中断switch语句,而不是while语句。使用gameLoop标签可以更加明确的让控制流终止。 同样要注意,当调用continue gameLoop来跳到下一个迭代循环中不是必须使用gameLoop标签。因为这里只有一个循环体,不会受到其他循环体的影响。然而,用了gameLoop标签也没什么不好。这样做保持与break旁边的标签统一,有助于让游戏逻辑能更加清晰阅读和理解。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部