Swift 循环(长文解析)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在编程的世界中,循环如同一台高效的“重复执行机器”,它让开发者能够用简洁的代码实现复杂的数据处理或重复性操作。在 Swift 语言中,Swift 循环的设计既优雅又灵活,能够适应从简单迭代到复杂逻辑控制的多样化需求。无论是遍历数组、处理用户输入,还是执行数学计算,掌握 Swift 循环的核心机制,是提升编程效率的关键一步。本文将从基础语法到高级技巧,结合实际案例,帮助读者系统性地理解 Swift 循环的实现逻辑与应用场景。
一、基础循环结构:构建循环的三大核心类型
1.1 for-in 循环:最直观的迭代工具
for-in 循环是 Swift 中最常用且简洁的循环结构,其核心功能是遍历集合(如数组、字典、字符串)或范围(如 1...10
)。它的语法简单直观,通过 in
关键字将变量绑定到集合中的每个元素,从而逐个执行循环体内的代码。
示例 1:遍历数组并输出元素
let numbers = [10, 20, 30, 40]
for number in numbers {
print("当前元素是:\(number)")
}
// 输出:
// 当前元素是:10
// 当前元素是:20
// 当前元素是:30
// 当前元素是:40
示例 2:遍历数字范围
for i in 1...5 {
print("第 \(i) 次循环")
}
// 输出:第 1 次循环到第 5 次循环
比喻:想象你在整理书架上的书籍,for-in
就像一本一本拿起书,查看书名后再放回——循环自动处理了“拿取”和“放回”的过程,开发者只需关注“查看书名”的逻辑。
1.2 while 循环:条件驱动的灵活控制
while 循环的核心是“先判断条件,后执行循环体”。当条件为 true
时,循环会重复执行,直到条件变为 false
。这种结构适合在循环次数不确定的情况下使用,例如等待用户输入或处理动态数据。
示例:等待用户输入有效数字
var userInput: Int?
while userInput == nil {
print("请输入一个整数:")
if let input = Int(readLine() ?? "") {
userInput = input
} else {
print("输入无效,请重新输入!")
}
}
print("您输入的有效数字是:\(userInput!)")
注意事项:若条件永远为 true
,将导致无限循环。例如:while true { ... }
需结合 break
语句终止。
1.3 repeat-while 循环:先执行后判断的特殊逻辑
与 while 相反,repeat-while 循环会“先执行循环体,再判断条件”。这意味着无论条件是否满足,循环体至少会执行一次。这种结构适合需要“至少执行一次操作”的场景。
示例:强制用户输入有效邮箱
var email: String?
repeat {
print("请输入邮箱地址:")
email = readLine()
} while email?.contains("@") == false
print("邮箱验证通过:\(email!)")
对比表格
(与前一行空一行)
| 循环类型 | 判断时机 | 特点 |
|---------|---------|-----|
| for-in
| 无需显式条件 | 专为集合遍历设计,代码简洁 |
| while
| 先判断后执行 | 条件满足时重复执行,适合动态次数 |
| repeat-while
| 先执行后判断 | 循环体至少执行一次,适合必做操作 |
二、进阶技巧:循环的扩展与优化
2.1 遍历集合的高级方法:索引与键值对
在遍历数组或字典时,Swift 提供了 enumerated()
方法和字典的 forEach
方法,让开发者同时获取元素的索引或键值对。
示例 1:使用 enumerated() 获取索引
let fruits = ["苹果", "香蕉", "橙子"]
for (index, fruit) in fruits.enumerated() {
print("第 \(index + 1) 个水果:\(fruit)")
}
// 输出:
// 第 1 个水果:苹果
// 第 2 个水果:香蕉
// 第 3 个水果:橙子
示例 2:遍历字典的键值对
let scores = ["数学": 90, "语文": 85, "英语": 95]
for (subject, score) in scores {
print("\(subject) 的分数是:\(score)")
}
2.2 控制循环流程:break、continue 与 guard
在循环中,开发者可通过以下工具控制流程:
- break:立即终止循环。
- continue:跳过当前迭代,直接进入下一次循环。
- guard:在循环外层提前验证条件,避免复杂嵌套。
示例:查找数组中的特定元素
let numbers = [12, 34, 56, 78, 90]
for number in numbers {
if number == 78 {
print("找到目标:\(number)")
break
} else if number % 2 == 0 {
continue // 跳过偶数的后续处理
}
print("当前处理:\(number)") // 仅奇数会执行此行
}
2.3 函数式编程与循环:map、filter 的巧妙结合
Swift 的函数式编程特性(如 map
、filter
)可以替代传统循环,实现更简洁的代码逻辑。
示例:筛选并转换数组
let numbers = [1, 2, 3, 4, 5]
let evenSquares = numbers.filter { $0 % 2 == 0 }
.map { $0 * $0 }
print(evenSquares) // 输出:[4, 16]
三、实战案例:循环在实际开发中的应用
3.1 斐波那契数列生成器
通过 for-in 循环和数组操作,生成前 N 项斐波那契数列:
func generateFibonacci(upTo count: Int) -> [Int] {
guard count > 0 else { return [] }
var sequence = [0, 1]
for _ in 2..<count {
let next = sequence[sequence.count - 1] + sequence[sequence.count - 2]
sequence.append(next)
}
return sequence
}
print(generateFibonacci(upTo: 10)) // 输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
3.2 文件行处理:逐行读取与统计
使用 while 循环逐行读取文件内容,并统计特定关键词的出现次数:
let fileContent = "Swift 是一门强大的语言。Swift 适用于 iOS 开发。"
var count = 0
var line = ""
while let nextLine = fileContent.components(separatedBy: ". ").first {
if nextLine.contains("Swift") {
count += 1
}
line = nextLine
// 这里简化了文件处理逻辑,实际开发需结合文件流
}
print("关键词 'Swift' 出现次数:\(count)") // 输出:2
四、性能优化:让循环更高效
4.1 避免嵌套循环的性能陷阱
嵌套循环的时间复杂度为 (O(n^2)),可能导致性能下降。例如遍历二维数组时,应优先考虑扁平化数据结构或提前终止条件。
4.2 利用集合方法减少循环次数
通过 contains
、firstIndex
等集合方法,减少手动循环的次数。例如:
let items = ["apple", "banana", "orange"]
if items.contains("banana") {
print("找到了!")
}
// 相比于手动遍历逐个比较,更高效
4.3 空间换时间:预计算与缓存
对于需要频繁计算的循环,可预先存储中间结果,避免重复计算。例如:
let fibonacciCache = generateFibonacci(upTo: 100) // 缓存前 100 项
// 后续调用直接访问缓存数组,无需重新计算
结论
Swift 循环是开发者构建复杂逻辑的重要工具,其灵活性与高效性在日常开发中不可或缺。从基础的 for-in
到高级的函数式编程技巧,掌握不同场景下的循环设计,不仅能提升代码的可读性与性能,更能帮助开发者以更优雅的方式解决问题。建议读者通过实际项目练习,例如实现数据统计工具或游戏逻辑,逐步深化对 Swift 循环的理解。记住,编程如同搭积木——每个循环结构都是构建庞大系统的基石,而你的创造力将决定最终作品的形态!