Swift repeat…while 循环:从入门到实战掌握
在 Swift 编程语言中,循环结构是控制程序流程的核心工具之一。当你需要重复执行一段代码直到满足特定条件时,repeat…while 循环就显得尤为实用。与 while 循环不同,repeat…while 的显著特点是无论条件是否成立,至少会执行一次循环体。这个特性让它在某些场景下比传统 while 更加安全和直观。
想象一下你正在玩一个猜数字游戏:程序随机生成一个 1 到 100 的数字,你每次输入猜测值,系统告诉你“太大了”或“太小了”,直到猜中为止。在这个场景中,你必须至少猜一次,无论第一次猜对还是猜错。这种“先执行再判断”的逻辑,正是 repeat…while 循环的用武之地。
语法结构与执行流程
repeat…while 循环的基本语法非常简洁:
repeat {
// 循环体代码
} while 条件表达式
它的执行流程如下:
- 首先执行一次循环体中的代码;
- 然后判断
while后面的条件表达式; - 如果条件为
true,则再次执行循环体; - 如果条件为
false,则退出循环。
这个“先执行后判断”的顺序,是它与 while 循环最本质的区别。你可以把 repeat…while 想象成一个“先做再说”的流程:不管结果如何,先把事情做了,再决定要不要继续。
与 while 循环的对比:为什么需要 repeat…while?
我们通过一个对比来理解两者的差异。
示例:输入验证(用户输入必须是正整数)
// 使用 while 循环(存在潜在问题)
var number = 0
while number <= 0 {
print("请输入一个大于 0 的整数:")
if let input = readLine(), let value = Int(input) {
number = value
}
}
print("你输入的数字是:\(number)")
这段代码的问题在于:如果用户第一次输入的不是数字(比如输入 "abc"),Int(input) 会返回 nil,number 仍然为 0,循环将继续执行。但若用户输入了无效数据,程序可能卡在循环中,甚至出现意外行为。
而使用 repeat…while 可以更自然地处理这类问题:
// 使用 repeat…while 循环(更安全)
var number = 0
repeat {
print("请输入一个大于 0 的整数:")
if let input = readLine(), let value = Int(input) {
number = value
} else {
print("输入无效,请重新输入!")
number = 0 // 重置,确保继续循环
}
} while number <= 0
print("你输入的数字是:\(number)")
关键区别:
repeat…while保证了至少执行一次while循环无法保证的。
实际应用场景:游戏开发与输入处理
案例:简易猜数字游戏
我们来实现一个完整的猜数字小游戏,使用 repeat…while 循环处理用户输入和判断逻辑。
import Foundation
// 随机生成 1 到 100 的目标数字
let targetNumber = Int.random(in: 1...100)
var guess = 0
var attempts = 0
print("欢迎来到猜数字游戏!我已经想好了一个 1 到 100 的数字。")
// 使用 repeat…while 确保至少进行一次猜测
repeat {
print("请输入你的猜测:")
// 读取用户输入
if let input = readLine(), let userGuess = Int(input) {
guess = userGuess
attempts += 1
// 判断猜测结果
if guess < targetNumber {
print("太小了!")
} else if guess > targetNumber {
print("太大了!")
} else {
print("恭喜你!猜对了!")
print("总共用了 \(attempts) 次猜测。")
}
} else {
print("请输入有效的整数!")
// 输入无效时,不增加尝试次数
// 但继续循环,让用户重试
}
} while guess != targetNumber
print("游戏结束,再见!")
设计思考:在这个例子中,
repeat…while的“至少执行一次”特性至关重要。用户必须先输入一次猜测,才能开始游戏。如果使用while,程序可能根本不会提示用户输入,导致“无反馈”问题。
嵌套循环与复杂逻辑处理
repeat…while 也可以与其他控制结构结合使用,处理更复杂的业务逻辑。
案例:模拟 ATM 取款流程
var balance = 1000.0 // 初始余额
var withdrawAmount = 0.0
var continueTransaction = true
// 使用 repeat…while 实现交易主循环
repeat {
print("=== ATM 取款系统 ===")
print("当前余额:\(balance) 元")
print("1. 取款")
print("2. 查询余额")
print("3. 退出")
print("请选择操作:")
if let choice = readLine(), let option = Int(choice) {
switch option {
case 1:
print("请输入取款金额:")
if let amount = readLine(), let value = Double(amount) {
if value <= 0 {
print("金额必须大于 0!")
} else if value > balance {
print("余额不足!")
} else {
balance -= value
withdrawAmount += value
print("取款成功!已取出 \(value) 元。")
}
} else {
print("请输入有效金额!")
}
case 2:
print("当前余额:\(balance) 元")
case 3:
continueTransaction = false
print("感谢使用,再见!")
default:
print("无效选项,请重新选择。")
}
} else {
print("请输入有效选项(1-3)")
}
// 询问是否继续交易
if continueTransaction {
print("是否继续交易?(y/n)")
if let response = readLine()?.lowercased(), response == "n" {
continueTransaction = false
}
}
} while continueTransaction
// 输出最终统计
print("本次交易共取出 \(withdrawAmount) 元。")
设计优势:整个 ATM 流程以
repeat…while为主循环,确保用户至少能看到菜单并选择一次操作。即使用户选择“退出”,也完成了至少一次交互,用户体验更自然。
常见误区与最佳实践
误区 1:忘记更新条件变量
// ❌ 错误示例:无限循环
var count = 0
repeat {
print("count = \(count)")
// 忘记更新 count,导致条件永远为 true
} while count < 5
修复方法:确保循环体内有更新条件变量的语句。
// ✅ 正确写法
var count = 0
repeat {
print("count = \(count)")
count += 1 // 必须更新
} while count < 5
误区 2:条件判断写反
// ❌ 错误:逻辑混乱
var isFinished = false
repeat {
// 执行任务
isFinished = true
} while isFinished == false
建议:使用清晰的布尔变量命名,避免嵌套逻辑。
总结:为什么 repeat…while 循环值得掌握?
Swift repeat…while 循环 并不是一个“花哨”的语法,而是一种在特定场景下更安全、更直观的控制结构。它特别适合那些“必须先执行一次”的任务,比如:
- 用户输入验证
- 游戏主循环
- 交互式命令行程序
- 初始化流程
掌握它,不仅能让你写出更健壮的代码,还能在设计程序流程时拥有更灵活的选择。当你在写一个“先做后判断”的逻辑时,不妨先想想:是不是该用 repeat…while?
记住:循环不是为了写得复杂,而是为了让程序更聪明、更可靠。而 Swift repeat…while 循环,正是通往这个目标的一把钥匙。