4.3 循环结构
在程序编写中,常常会有大量而重复的操作,而这也是计算机计算的优势所在,对于开发者来说,循环结构就是为执行大量而重复代码块诞生的。Swift语言主要提供了for-in遍历、while与repeat-while条件循环3种循环结构。
4.3.1 for-in循环结构
读者对于for-in结构并不陌生,在前面章节中介绍的很多内容都提前使用了for-in结构进行演示。如果读者了解C/Objective-C语言,那么这里就要注意了,在C/Objective-C语言中也支持for-in这种循环结构,但是其被称为快速遍历,用它来进行的循环操作将是无序的。Swift语言中的for-in结构则强大很多,其可以进行无序的循环遍历,也可以进行有序的循环遍历。
在Swift 2.2及以上版本中,在循环结构中做的最大更改就是删除了经典的for()循环结构,许多C/Objective-C语言的开发者可能会不太习惯,事实上,Swift语言中的for-in结构已经完全可以代替曾经的for()循环,并且比for()循环的实现更加简洁优美,同for()循环一同移除的还有“++”和“--”运算符。
使用Xcode开发工具创建一个命名为ControlFlow的playground,进行循环代码的测试。要使用for-in结构进行有序的循环遍历,需要配合区间运算符,并且指定一个循环次数变量,示例如下:
//将打印1,2,3,4,5 for index in 1...5 { print(index) }
for-in结构中需要两个参数,第2个参数可以是一个集合类型的实例,也可以是一个范围区间,第1个参数为捕获参数,每次从第2个参数中遍历出的元素便会赋值给它,开发者在循环结构中可以直接使用。
如果在进行for-in循环遍历的时候,开发者并不需要捕获到的值,可以使用匿名参数来接收,Swift中使用“_”符号来表示匿名参数,示例如下:
//如果不需要获取循环中的循环次序 可以使用如下方式 var sum=0; for _ in 1...3 { sum += 1 }
对集合的遍历是for-in循环最常用的场景之一,这些在前边讲解集合类型的章节中有详细的介绍,简单的示例代码如下:
//遍历集合类型 var collection1:Array = [1,2,3,4] var collection2:Dictionary = [1:1,2:2,3:4,4:4] var collection3:Set = [1,2,3,4] for obj in collection1 { print(obj) } for (key , value) in collection2 { print(key, value) } for obj in collection3 { print(obj) }
4.3.2 while与repeat-while条件循环结构
while与repeat-while结构在C/Objective-C语言中也支持,并且功能基本一致,只是Swift语言将do-while结构修改为repeat-while。
在开发中,经常会遇到需要进行条件循环的需求,例如模拟水池蓄水的过程,每次蓄水1/10,当蓄满水后停止蓄水。while循环结构可以十分方便地创建这类循环代码,示例如下:
var i=0 //当i不小于10时跳出循环 while i<10 { print("while", i) //进行i的自增加 i+=1 }
while循环结构中,while关键字后面需要填写一个逻辑值或者以逻辑值为结果的表达式作为循环条件,如果逻辑值为真,则程序会进入while循环体。执行完循环体的代码后进行循环条件的判断,如果循环条件依然为真则会再次进入循环体,否则循环结束。由于while循环是根据循环条件来判断是否进入循环体的,如果循环条件一直成立,则会无限循环,因此开发者在使用while循环的时候,注意要在循环体中对循环条件进行修改,且修改的结果是循环条件将不成立,否则会出现死循环。
上面演示的while结构会先进行条件判断,然后再进行循环体的执行。repeat-while结构则会先执行一次循环体,再进行循环条件的判断,图4-1中列出了两种结构的异同。
图4-1 while结构与repeat-while结构的异同
repeat-while循环结构示例代码如下:
var j=0 //先执行一次循环体 再判断循环条件是否成立 repeat { print("repeat while") j+=1 } while j<10