while 与 repeat-while
本教程共 93 篇 · 第 25 篇 · 更新于 2026-08-08 · 约 8 分钟阅读
本节目标:理解 while 和 repeat-while 的区别,知道什么时候该先判断、什么时候该先执行一次。
for-in 适合“已知要遍历什么”的情况。可有些循环你事先并不知道要跑几轮,只清楚“某个条件满足就继续、不满足就停”。这类场景交给 while 和 repeat-while。它们靠条件收尾,而不是靠固定的次数,是处理“动态长度”循环的主力。
1-1 while:先判断,再执行
while 在每轮开始前先检查条件。条件为 true 才进循环体;一旦为 false,循环立刻结束,一轮都不多跑。
var count = 0
while count < 3 {
print("第 \(count) 轮")
count += 1
}
count 从 0 开始,每轮打印并加 1。当 count 变成 3,条件 count < 3 不成立,循环退出。打印的是 0、1、2 三轮。注意条件写在 while 后面,循环体在花括号里,顺序千万别搞反。
Warning写
while务必保证循环体里能改变条件相关的变量,否则条件永远为真,就成了死循环,程序卡死不下去。这是 while 最经典的翻车方式,新手尤其要盯紧。
1-2 repeat-while:先执行,再判断
repeat-while 把顺序反过来:先无条件执行一轮循环体,跑完才在末尾判断条件。只要条件还是 true 就继续,是 false 才停。
var count = 0
repeat {
print("第 \(count) 轮")
count += 1
} while count < 3
结果同样是打印 0、1、2。但区别在于:哪怕一开始条件就是 false,repeat-while 也至少会执行这一轮。它相当于别的语言里的 do-while,语法上是 repeat { } while 条件,while 在右花括号之后。
var x = 10
repeat {
print("这行一定会执行一次")
} while x < 0
x < 0 从一开始就是 false,但因为是 repeat-while,花括号里的打印照样跑了一次,然后才退出。这个“至少一次”的特性,正是它存在的理由。
1-3 两者最大的差别在哪
一句话:while 可能一次都不执行,repeat-while 至少执行一次。
这个差别决定选型。如果某段逻辑“必须先做点什么,才能判断能不能继续”,用 repeat-while 更自然。比如读取用户输入:你得先读一次,才能判断用户是不是输入了“退出”。如果用 while,你还没读就判断,逻辑对不上。
反过来,如果“不满足条件就根本不该开始”,用 while。比如只有在库存大于 0 时才进入发货循环,一开始就没货,while 直接跳过,这正是想要的行为。
1-4 一个稍真实的例子
假设你从一个随机起点往前走,每次走一步,直到走出某段距离。走之前并不知道要走几步:
var steps = 0
let target = 5
while steps < target {
steps += 1
print("走了 \(steps) 步")
}
print("到达目标")
只要 steps 还没到 target,就继续走。轮数完全由运行过程决定,这正是 while 的用武之地。换成 repeat-while 也行,但语义上“先走一步再看够不够”同样说得通,差别只在边界情况。
Tip拿不准用哪个时,问自己一句:这个条件在第一次执行前就可能为假吗?如果是,且为假时你确实不想执行,就用
while;如果无论如何都要先跑一次,就用repeat-while。
1-5 条件里的常见写法
while 后面的条件同样必须是布尔值。你可以写直接的比较,也可以写更复杂的布尔表达式。循环体里通常会修改某个影响条件的变量,这是 while 能正常结束的关键。
var balance = 100
while balance > 0 {
balance -= 10
print("剩余 \(balance)")
}
每轮减 10,直到 balance 不再大于 0。注意条件用的是 > 0,所以最后 balance 变成 0 时循环停下,不会继续减成负数。条件边界怎么写,直接决定了循环结束时变量停在哪个值。
1-6 初学者易踩的坑
第一,忘记更新条件变量。最常见的死循环就是循环体里忘了 count += 1 这类操作,导致条件永远不变。
第二,把 repeat-while 的 while 写在花括号外面当成 while 用。语法是 repeat { } while 条件,while 在右花括号之后,别写反,否则编译直接报错。
第三,误以为 while 一定比 repeat-while 安全。其实两者都能写出死循环,安全与否取决于你有没有正确修改条件,和用哪个关键字无关。
1-7 写成“无限循环”再内部跳出
有时你确实想让循环一直跑,直到内部某个条件触发才停,这时可以写 while true { },并在循环体里用 break 退出。这种写法常见于“等待用户输入”“事件监听”这类不知道要跑多久的场景。
while true {
let input = "退出" // 实际中来自用户输入
if input == "退出" {
break
}
}
while true 本身条件永远为真,所以全靠内部的 break 收尾。这种写法责任交给了你:必须保证某条路径能 break,否则就是真·死循环。
1-8 选型速查
实在拿不准,用下面这张表对号入座:
- 已知要跑几轮、或要遍历一个集合 → 用
for-in; - 次数未知、且可能一次都不该跑 → 用
while; - 次数未知、但无论如何要先跑一次 → 用
repeat-while; - 次数未知、且靠内部事件决定何时停 →
while true配break。
记住核心一句:while 看门前,repeat-while 看门后。条件在进门之前判,就用 while;条件在出门之后判,就用 repeat-while。
1-9 while 与 for-in 可以互相改写
一个“已知次数”的循环,用 for-in 和用 while 都能写。比如数到 5:
for i in 1...5 {
print(i)
}
var j = 1
while j <= 5 {
print(j)
j += 1
}
两者效果一样。区别在意图:for-in 把“次数”直接写在范围里,读的人一眼看到边界;while 把计数藏进变量,更灵活但也更容易漏掉 j += 1。所以当次数明确、且就是对一个序列操作时,for-in 更直观;当退出条件复杂、和多个变量纠缠时,while 更合适。
写 while 类循环有个心法:先在脑子里想清楚“它什么时候停”,再去想“它每次干什么”。很多人只关注循环体里做什么,却忽略了退出条件,结果写出死循环。建议每次写完都自检一遍:循环体里有没有哪条路径能让条件最终变 false?只要有一条,循环就能正常收尾;一条都没有,就该警惕了。把“退出”当成一等公民来对待,循环就稳了。
1-10 一句话收尾
while 适合“看条件”的循环,repeat-while 适合“至少跑一次”的循环。记住这条,再配合前面“写之前想清楚何时停”的心法,绝大多数循环场景你都能选对、写稳。
while 与 repeat-while 补齐了循环家族。下一章我们讲控制转移语句 break、continue、fallthrough 和带标签的语句,让你在循环和 switch 里更精准地控制流向。