循环控制流
快速掌握 Swift 的控制流,了解如何编写循环,使其在满足指定条件前重复执行任务。
循环与条件控制流
无论使用哪种编程语言,应用程序开发本质上都是逻辑的应用,而编程的艺术很大程度上在于编写能够根据一个或多个条件做出决策的代码。这些决策决定了哪些代码会被执行、执行多少次,以及在程序运行时哪些代码会被跳过。这通常被称为控制流,因为它控制着程序执行的流程。控制流通常分为两类:循环控制流(代码执行的次数)和条件控制流(代码是否执行)。本节内容旨在为 Swift 中这两种控制流类型提供入门级概述。
循环控制流
我们首先来看以循环形式存在的控制流。循环本质上是一系列需要重复执行直到满足特定条件的 Swift 语句。我们将首先探讨的第一个循环语句是 for-in 循环。
Swift 的 for-in 语句
for-in 循环用于遍历集合或数字范围中的项目序列,并提供一种简单易用的循环方式。
for-in 循环的语法如下:
1for 常量名称 in 集合或范围 { 2 // 要执行的代码 3}
在上述语法中,常量名称 是用于存储当前迭代项的常量名称,该项来自正在遍历的 集合 或 范围。循环体中的代码通常会使用该常量名称来引用当前循环周期中的项目。集合或范围指明了循环所遍历的内容。例如,它可以是一个字符串数组、范围操作符,甚至是一个字符字符串(集合的具体内容将在课程中“Swift 数组与字典集合”部分详细讲解)。
例如,考虑以下 for-in 循环结构:
1for index in 1...5 { 2 print("index 的值是 \(index)") 3}
该循环从声明当前项将被赋给名为 index 的常量开始。接着声明了一个闭区间操作符,表示 for-in 循环将遍历从 1 到 5 的数字范围。循环体仅向控制台输出一条消息,显示当前赋给 index 常量的值,结果如下:
1index 的值是 1 2index 的值是 2 3index 的值是 3 4index 的值是 4 5index 的值是 5
正如将在“Swift 数组与字典集合”课程中展示的那样,for-in 循环在处理数组和字典等集合时特别有用。
在循环声明中指定一个常量名称来存储当前项目的引用并非必须。如果循环体中不需要引用当前值,可以在循环声明中用下划线字符 _ 替代常量名称。例如:
1var count = 0 2 3for _ in 1...5 { 4 // 不需要引用当前值。 5 count += 1 6} 7 8print("count = \(count)")
while 循环
前面介绍的 Swift for-in 循环在已知某项任务需要重复执行的次数时非常适用。然而,在某些情况下,代码需要重复执行直到满足某个条件,而事先无法确定需要重复多少次才能达成目标。为解决这一需求,Swift 提供了 while 循环。
本质上,while 循环在指定条件为真时重复执行一组任务。while 循环的语法如下:
1while 条件 { 2 // Swift 语句写在这里 3}
在上述语法中,条件 是一个返回 true 或 false 的表达式,// Swift 语句写在这里 注释代表当条件表达式为 true 时要执行的代码。例如:
1var myCount = 0 2 3while myCount < 100 { 4 myCount += 1 5} 6 7print("myCount = \(myCount)")
在上述示例中,while 表达式会判断 myCount 变量是否小于 100。如果它已经大于等于 100,则花括号内的代码将被跳过,循环直接退出,不执行任何任务。
另一方面,如果 myCount 小于 100,则执行花括号内的代码,然后循环返回到 while 语句,重新评估 myCount。此过程持续进行,直到 myCount 的值大于等于 100。此时,循环结束。
repeat ... while 循环
repeat ... while 循环取代了早期 Swift 版本中的 do .. while 循环。可以将 repeat ... while 循环理解为一种倒置的 while 循环。while 循环在执行循环体之前先评估条件;如果第一次检查条件就为 false,则循环体不会被执行。而 repeat ... while 循环适用于你确信循环体中的代码至少需要执行一次的情况。例如,你可能希望不断遍历数组中的项目,直到找到特定项目为止。你清楚地知道,为了找到所需条目,至少必须检查数组的第一个元素。repeat ... while 循环的语法如下:
1repeat { 2 // Swift 语句写在这里 3} while 条件表达式
在下面的 repeat ... while 示例中,循环将持续执行,直到名为 i 的变量值等于 0:
1var i = 10 2 3repeat { 4 i -= 1 5 print("i = \(i)") 6} while (i > 0)
从循环中跳出
创建循环后,可能会在某些条件下希望提前退出循环(尤其是在创建了无限循环的情况下)。一个典型例子是持续监控网络套接字上的活动。一旦检测到活动,很可能就需要退出监控循环并执行其他任务。
为实现从循环中跳出,Swift 提供了 break 语句,它会立即退出当前循环,并从循环之后的代码继续执行。例如:
1var j = 10 2 3for _ in 0 ..< 100 { 4 j += j 5 6 if j > 100 { 7 break 8 } 9 10 print("j = \(j)") 11}
在上述示例中,循环将继续执行,直到 j 的值超过 100。此时,循环将退出,程序继续执行循环之后的下一行代码。
continue 语句
continue 语句会跳过循环体中剩余的所有代码,直接返回到循环顶部。在以下示例中,只有当变量 i 的值为偶数时,才会调用 print 函数:
1var i = 1 2 3while i < 20 { 4 i += 1 5 6 if (i % 2) != 0 { 7 continue 8 } 9 10 print("i = \(i)") 11}
上述示例中的 continue 语句将导致 print 调用被跳过,除非 i 的值能被 2 整除且无余数。如果触发了 continue,执行将跳转到 while 循环的顶部,循环体中的语句将再次执行(直到 i 的值超过 19)。
课程小结
-
循环是重复执行一系列 Swift 语句直到满足某个条件的结构。
-
for-in循环可用于按指定次数迭代,通常是在集合或数字范围中的项目序列上进行。 -
while循环适用于需要在条件满足前反复执行任务,且不确定具体次数的情况。 -
如果在进入
while循环时条件已满足,则循环体中的所有语句都不会被执行。 -
repeat ... while循环适用于你确信循环体中的代码至少需要执行一次的情况。与while循环不同,它的条件是在循环体执行之后才检查。 -
使用
break语句可完全退出当前循环。 -
使用
continue语句可跳过循环体中剩余的语句,直接返回到循环顶部。
测验
完成以下测验,检验你对 Swift 循环语法的掌握程度。
练习
通过完成以下练习,巩固你在 Swift 中对循环控制流的理解。
练习 1
以下代码创建了一个无限循环,永远不会退出。请添加一个 if 语句,当变量 i 等于 10 时退出循环。
练习
1var i = 0 2 3while (true) { 4 i += 1 5} 6 7print("i = \(i)")
解答
1var i = 0 2 3while (true) { 4 i += 1 5 6 if (i == 10) { 7 break 8 } 9} 10 11print("i = \(i)")
练习 2
修改以下 for-in 循环,使其通过 print 语句输出当前值。
练习
1for _ in 1...5 { 2 3}
解答
1for i in 1...5 { 2 print("i = \(i)") 3}
Quiz
当需要把某个任务重复执行特定次数时,以下哪种循环语句最合适?