Swift 循环详解:for-in、while 与 repeat-while 实战指南

发布时间:2026/10/2 10:24:16

Swift 循环详解:for-in、while 与 repeat-while 实战指南 1. 引言循环是编程语言中最基础也最常用的控制结构之一。在 Swift 中循环不仅用于遍历数组、字典等集合类型还广泛应用于数值计算、状态轮询和异步任务处理等场景。本文将从 Swift 的三种循环语法入手结合丰富的代码实例帮助你彻底掌握 for-in、while 和 repeat-while 的使用技巧与适用场景。2. for-in 循环for-in 循环是 Swift 中最常用的循环形式它可以直接遍历序列类型如区间、数组、字典、字符串等语法简洁且可读性强。2.1 遍历区间使用闭区间运算符...和半开区间运算符..可以快速生成数值区间并进行遍历。// 闭区间包含 1 到 5 for index in 1...5 { print(当前数字\(index)) } // 输出1 2 3 4 5 // 半开区间包含 0 到 4不包含 5 for index in 0..5 { print(索引\(index)) } // 输出0 1 2 3 42.2 遍历数组遍历数组时可以直接获取每个元素如果需要同时获取索引和值可以使用 enumerated() 方法。let fruits [苹果, 香蕉, 橙子] // 直接遍历元素 for fruit in fruits { print(水果\(fruit)) } // 同时获取索引和值 for (index, fruit) in fruits.enumerated() { print(第 \(index 1) 个水果是 \(fruit)) }2.3 遍历字典字典的遍历会以键值对key-value的形式返回可以使用元组语法同时取出键和值。let scores [小明: 90, 小红: 85, 小刚: 78] for (name, score) in scores { print(\(name) 的分数是 \(score)) } // 只遍历键 for name in scores.keys { print(学生\(name)) } // 只遍历值 for score in scores.values { print(分数\(score)) }2.4 遍历字符串Swift 中的字符串可以直接被遍历每次迭代返回一个 Character 字符。let message Hello for char in message { print(char) } // 输出H e l l o2.5 使用 where 进行条件过滤在 for-in 循环中可以使用 where 子句对遍历的元素进行条件过滤避免在循环体内编写额外的 if 判断。let numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // 只打印偶数 for number in numbers where number % 2 0 { print(偶数\(number)) } // 输出2 4 6 8 102.6 使用 stride 进行步进遍历当需要按照指定步长遍历数值时可以使用 stride(from:to:by:) 或 stride(from:through:by:) 函数。// 从 0 到 10步长为 2不包含 10 for number in stride(from: 0, to: 10, by: 2) { print(number) } // 输出0 2 4 6 8 // 从 10 到 0步长为 -3包含 0 for number in stride(from: 10, through: 0, by: -3) { print(number) } // 输出10 7 4 13. while 循环while 循环在每次迭代开始前检查条件只有当条件为 true 时才执行循环体。它适用于循环次数不确定、需要根据运行时状态判断是否继续的场景。3.1 基础用法var count 0 while count 5 { print(当前计数\(count)) count 1 } // 输出0 1 2 3 43.2 实战猜数字游戏while 循环非常适合实现需要反复尝试直到满足条件的逻辑例如猜数字游戏。import Foundation let target Int.random(in: 1...100) var guess 0 var attempts 0 print(猜一个 1 到 100 之间的数字) while guess ! target { attempts 1 print(第 \(attempts) 次猜测, terminator: ) if let input readLine(), let number Int(input) { guess number if guess target { print(猜大了) } else if guess target { print(猜小了) } } else { print(输入无效请重新输入) } } print(恭喜你猜对了答案是 \(target)共用了 \(attempts) 次)3.3 实战模拟掷骰子直到出现 6import Foundation var rollCount 0 var diceValue 0 while diceValue ! 6 { diceValue Int.random(in: 1...6) rollCount 1 print(第 \(rollCount) 次掷骰子结果是 \(diceValue)) } print(终于掷出了 6共掷了 \(rollCount) 次)4. repeat-while 循环repeat-while 循环与 while 循环的区别在于它先执行一次循环体再检查条件。因此repeat-while 至少会执行一次循环体适用于至少需要执行一次操作的场景。4.1 基础用法var number 10 repeat { print(当前值\(number)) number - 3 } while number 0 // 输出10 7 4 14.2 实战用户输入验证repeat-while 非常适合用于需要至少执行一次输入操作的场景例如要求用户输入一个合法的数字。import Foundation var inputNumber: Int? repeat { print(请输入一个 1 到 10 之间的数字, terminator: ) if let input readLine(), let number Int(input), (1...10).contains(number) { inputNumber number } else { print(输入无效请重新输入) } } while inputNumber nil print(你输入的数字是\(inputNumber!))4.3 while 与 repeat-while 的区别下面的例子可以直观地展示两者的区别当初始条件为 false 时while 循环一次都不会执行而 repeat-while 至少会执行一次。var condition false // while 循环条件为 false循环体一次都不执行 while condition { print(这行不会输出) } // repeat-while 循环先执行一次循环体再判断条件 repeat { print(这行会输出一次) } while condition // 输出这行会输出一次5. 循环控制语句在实际开发中经常需要在循环中提前跳出或跳过某些迭代。Swift 提供了 break、continue 和 fallthrough 等控制语句。5.1 break 跳出循环break 用于立即终止整个循环的执行跳出循环体。let numbers [1, 3, 5, 7, 9, 10, 12] for number in numbers { if number % 2 0 { print(找到第一个偶数\(number)) break } print(检查数字\(number)) } // 输出检查数字1 3 5 7 9 找到第一个偶数105.2 continue 跳过当前迭代continue 用于跳过当前迭代中剩余的代码直接进入下一次循环。for number in 1...10 { if number % 3 0 { continue } print(number) } // 输出1 2 4 5 7 8 105.3 带标签的循环在嵌套循环中可以使用标签label配合 break 或 continue 来精确控制跳出哪一层循环。outerLoop: for i in 1...3 { for j in 1...3 { if i 2 j 2 { print(命中 (2, 2)跳出外层循环) break outerLoop } print((\(i), \(j))) } } // 输出(1, 1) (1, 2) (1, 3) (2, 1) (2, 2) 命中 (2, 2)跳出外层循环6. 实战案例综合运用下面通过两个完整的实战案例综合运用本文介绍的循环知识。6.1 案例一打印九九乘法表使用嵌套 for-in 循环打印经典的九九乘法表。for i in 1...9 { var line for j in 1...i { line \(j)×\(i)\(i * j)\t } print(line) }6.2 案例二斐波那契数列使用 for-in 循环生成斐波那契数列的前 N 项。func fibonacci(_ n: Int) - [Int] { guard n 0 else { return [] } if n 1 { return [0] } if n 2 { return [0, 1] } var sequence [0, 1] for _ in 2..n { let next sequence[sequence.count - 1] sequence[sequence.count - 2] sequence.append(next) } return sequence } let result fibonacci(10) print(result) // 输出[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]7. 总结本文详细介绍了 Swift 中的三种循环结构for-in、while 和 repeat-while并通过大量代码实例展示了它们的语法和典型应用场景。在实际开发中选择哪种循环取决于具体需求遍历集合或区间时优先使用 for-in循环次数不确定且需要先判断条件时使用 while至少需要执行一次循环体时使用 repeat-while。同时合理使用 break、continue 和循环标签可以让代码更加简洁高效。希望本文能帮助你更好地掌握 Swift 循环的使用技巧。
延伸阅读

更多相关文章

2026/10/2 10:01:00

供应链背景转行SAP MM顾问:业务理解是优势,配置思维是关键

你是不是也听过“SAP顾问薪资高、前景好”,但一想到要学ABAP编程、懂财务、会业务,就觉得门槛太高,无从下手?特别是对于有供应链、仓储或采购背景的朋友,想转行却不知道如何将现有经验与SAP结合,更担心学完…

2026/9/30 11:39:32

LaTeX多图并排排版实战:subcaption宏包与minipage环境详解

1. 项目概述:为什么LaTeX图片排版值得深究? 写论文、做报告,尤其是理工科的朋友,对LaTeX一定不陌生。它强大的公式排版能力让人爱不释手,但一到图片排版,很多人就开始头疼了。特别是当我们需要将多张图片并…

2026/10/2 10:23:27

Linux系统学习笔记:从基础命令到服务部署的完整知识框架

2026年1月12日,我把过去一年多攒下的Linux知识重新整理了一遍。起因很直接:手边三台机器——一台跑业务的Rocky Linux 9服务器、一台装着Debian 13(Trixie)的退役笔记本、一台放在虚拟机里的Kali——每台上面都散落着半年前的笔记…

2026/10/2 10:23:27

基于Flask与Django的减脂食品电商网站设计与实现

做购物网站的项目,尤其是“减肥减脂轻食品”这种垂直品类,第一反应往往会落入“商品CRUD 购物车 订单”这种模板思路。但真正把这个项目从能跑做到好用,里面要抠的细节比想象中多得多——选型纠结、数据建模、库存扣减、热量计算、部署上线…

2026/10/2 10:23:27

CTF备赛指南:高频题型识别与解题链路全解析

1. 为什么你刷了三百道题,比赛还是拿不到分见过太多人一头扎进刷题软件,打开某平台的技能树从第一题往后硬怼。三个月过去,签到题闭着眼能交,密码学题看到密文还是两眼一黑,Web题拿到手第一反应永远是“点开F12找flag”…

2026/10/2 10:23:27

Fluent激光焊接与增材制造仿真:从物理模型到UDF实现全解析

1. 先把物理问题想清楚:焊接/增材仿真的本质与模型选型1.1 激光作用下的四个核心物理过程用Fluent做激光焊接或者增材制造(LPBF、DED这类)仿真,第一道坎往往不是软件操作,而是物理认知。很多人把激光焊接仿真简化成“一…

2026/10/2 10:23:27

软件测试流程拆解:需求评审、用例设计到缺陷报告的实战要点

很多人对软件测试工作流程的认知停留在一张流程图上,觉得把需求分析评审、测试计划、测试用例、用例评审、执行测试、跟踪定位bug、测试报告、缺陷报告这八件事按顺序排一遍就算懂了。真到了项目里,同样是走这八步,有人做得又快又稳&#xff…

2026/10/2 10:18:27

POD物理降维实战:从SVD分解到PyQt5交互式分析工具

简介:本资源是一份面向科研人员、工程师及高校师生的Python实现POD(本征正交分解)数据降维项目实战文档,聚焦高维数据压缩、物理系统主导特征提取与可解释性建模,适用于流体动力学、结构健康监测、医学影像等场景。资源…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/1 17:09:46

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/2 0:02:57

PWN入门:从栈溢出原理到ROP链实战

1. 这不是“学PWN”,是重新理解你每天敲的每一行C代码我第一次在CTF赛场上写出能控制程序流的exp时,手抖得连gdb的c命令都输错三次。那道题只有23行C代码,一个gets()调用,一个printf(),一个return——它甚至没开NX&…

2026/10/2 0:02:57

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑