Swift repeat…while 循环(超详细)

Swift repeat…while 循环:从入门到实战掌握

在 Swift 编程语言中,循环结构是控制程序流程的核心工具之一。当你需要重复执行一段代码直到满足特定条件时,repeat…while 循环就显得尤为实用。与 while 循环不同,repeat…while 的显著特点是无论条件是否成立,至少会执行一次循环体。这个特性让它在某些场景下比传统 while 更加安全和直观。

想象一下你正在玩一个猜数字游戏:程序随机生成一个 1 到 100 的数字,你每次输入猜测值,系统告诉你“太大了”或“太小了”,直到猜中为止。在这个场景中,你必须至少猜一次,无论第一次猜对还是猜错。这种“先执行再判断”的逻辑,正是 repeat…while 循环的用武之地。


语法结构与执行流程

repeat…while 循环的基本语法非常简洁:

repeat {
    // 循环体代码
} while 条件表达式

它的执行流程如下:

  1. 首先执行一次循环体中的代码;
  2. 然后判断 while 后面的条件表达式;
  3. 如果条件为 true,则再次执行循环体;
  4. 如果条件为 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) 会返回 nilnumber 仍然为 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 保证了至少执行一次 print 和用户输入提示,避免了“程序卡住无反馈”的尴尬情况。这是 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 循环,正是通往这个目标的一把钥匙。