Swift 循环
法则说明1. 优先用for-in最清晰2. 能用函数式就不用循环3. 区间用...或..<避免i++4. 至少一次用防止空跑5. 多层循环用标签清晰跳出你已完全掌握 Swift 循环!回复关键词继续学习Swift 异步循环(async/await)Swift 并行 map(ConcurrentMap)Swift 循环优化技巧SwiftUI ForEach 原理现在就用mapfilterreduce
·
Swift 循环全解析(2025 版)
“for、while、repeat” —— 掌握 8 种循环写法,写出 高效、可读、函数式 的 Swift 代码!
一、Swift 循环语句概览
| 循环类型 | 关键词 | 特点 |
|---|---|---|
for-in |
for ... in |
最常用,遍历序列 |
while |
while |
条件在前,先判断 |
repeat-while |
repeat { } while |
条件在后,至少执行一次 |
| 函数式循环 | map, filter, reduce |
无副作用,推荐 |
二、for-in 循环 —— 万能遍历
1. 遍历数字区间
// 闭区间:包含末尾
for i in 1...5 {
print(i) // 1,2,3,4,5
}
// 半开区间:不包含末尾
for i in 1..<5 {
print(i) // 1,2,3,4
}
2. 遍历数组
let fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits {
print(fruit)
}
// 带索引
for (index, fruit) in fruits.enumerated() {
print("\(index): \(fruit)")
}
3. 遍历字典
let scores = ["张三": 95, "李四": 88]
for (name, score) in scores {
print("\(name): \(score)分")
}
4. 遍历字符串(字符)
for char in "Swift" {
print(char) // S w i f t
}
5. 步长循环(stride)
// 从 0 到 10,步长 2
for i in stride(from: 0, to: 10, by: 2) {
print(i) // 0,2,4,6,8
}
// 包含末尾
for i in stride(from: 0, through: 10, by: 2) {
print(i) // 0,2,4,6,8,10
}
6. 忽略变量(用 _)
for _ in 1...3 {
print("重复3次")
}
三、while 循环 —— 条件在前
var count = 5
while count > 0 {
print("倒计时:\(count)")
count -= 1
}
适合:条件复杂、循环次数未知
四、repeat-while —— 至少执行一次
var dice = 0
repeat {
dice = Int.random(in: 1...6)
print("掷骰子:\(dice)")
} while dice != 6
print("终于掷出6!")
等价于其他语言的
do-while
五、循环控制语句
| 语句 | 功能 |
|---|---|
break |
跳出当前循环 |
continue |
跳过本次循环,进入下一次 |
fallthrough |
switch 中使用,穿透到下一个 case |
| 标签(Label) | 跳出多层循环 |
1. break 和 continue
for i in 1...10 {
if i % 2 == 0 {
continue // 跳过偶数
}
if i > 5 {
break // 提前结束
}
print(i) // 1,3,5
}
2. 标签(Label)跳出外层循环
outer: for i in 1...3 {
inner: for j in 1...3 {
if i == 2 && j == 2 {
break outer // 跳出外层循环
}
print("(\(i), \(j))")
}
}
// 输出:(1,1)(1,2)(1,3)(2,1)
六、函数式循环(推荐!)
无副作用、更安全、更快(并行优化)
1. map —— 转换
let numbers = [1, 2, 3, 4]
let doubled = numbers.map { $0 * 2 } // [2,4,6,8]
let strings = numbers.map { "\($0)" } // ["1","2","3","4"]
2. filter —— 过滤
let evens = numbers.filter { $0 % 2 == 0 } // [2,4]
let longNames = fruits.filter { $0.count > 2 }
3. reduce —— 聚合
let sum = numbers.reduce(0) { $0 + $1 } // 10
let product = numbers.reduce(1) { $0 * $1 } // 24
let joined = fruits.reduce("") { $0 + $1 } // "苹果香蕉橙子"
4. 链式调用
let result = numbers
.filter { $0 > 1 }
.map { $0 * $0 }
.reduce(0, +) // 2² + 3² + 4² = 29
七、无限循环(慎用)
// 方式1:while true
while true {
// 需要 break 退出
if condition { break }
}
// 方式2:for + where(Swift 5.5+)
for _ in sequence(first: 0, next: { $0 + 1 }) where $0 < 10 {
print("无限循环受控")
}
八、实战案例:九九乘法表
// 传统 for 循环
for i in 1...9 {
for j in 1...i {
print("\(j)×\(i)=\(i*j)", terminator: "\t")
}
print("") // 换行
}
// 函数式(一行!)
(1...9).forEach { i in
(1...i).forEach { j in
print("\(j)×\(i)=\(i*j)", terminator: "\t")
}
print("")
}
九、循环性能对比
| 方式 | 性能 | 内存 | 可读性 |
|---|---|---|---|
for-in |
快 | 低 | 高 |
while |
快 | 低 | 中 |
map/filter |
快(可并行) | 中 | 高 |
reduce |
快 | 低 | 高 |
结论:能用函数式就用函数式!
十、循环最佳实践
| 场景 | 推荐写法 |
|---|---|
| 遍历数组 | for item in array |
| 带索引 | for (i, item) in array.enumerated() |
| 数字序列 | 1...10 或 stride |
| 过滤转换 | array.filter { }.map { } |
| 累加/拼接 | reduce |
| 至少执行一次 | repeat-while |
| 跳出多层 | break label |
十一、常见错误 & 避坑
| 错误 | 正确做法 |
|---|---|
for i in 1..10 |
错误!应为 1..<10 或 1...10 |
array[i++] |
错误!Swift 无 ++ |
| 无限循环无退出 | 加 break 条件 |
for item in array { array.append(...) } |
可能死循环 |
忽略 enumerated() |
手动 var i = 0 易错 |
十二、速查表
| 循环 | 语法 |
|---|---|
| 闭区间 | 1...5 |
| 半开区间 | 1..<5 |
| 步长 | stride(from:to:by:) |
| 带索引 | .enumerated() |
| 跳过 | continue |
| 跳出 | break |
| 标签跳出 | break label |
| 至少一次 | repeat { } while |
十三、练习题(当场写!)
// 1. 打印 1 到 100 内所有 3 的倍数
for i in 1...100 where i % 3 == 0 {
print(i)
}
// 2. 用 reduce 计算数组平方和
let squares = [1, 2, 3, 4].reduce(0) { $0 + $1 * $1 }
// 3. 用 repeat-while 模拟掷硬币直到正面
var coin = ""
repeat {
coin = Bool.random() ? "正面" : "反面"
print(coin)
} while coin != "正面"
十四、完整练习:FizzBuzz
// 传统写法
for i in 1...100 {
if i % 15 == 0 {
print("FizzBuzz")
} else if i % 3 == 0 {
print("Fizz")
} else if i % 5 == 0 {
print("Buzz")
} else {
print(i)
}
}
// 函数式写法(一行!)
(1...100).forEach { n in
print(
n % 15 == 0 ? "FizzBuzz" :
n % 3 == 0 ? "Fizz" :
n % 5 == 0 ? "Buzz" : "\(n)"
)
}
总结:循环黄金法则
| 法则 | 说明 |
|---|---|
1. 优先用 for-in |
最清晰 |
| 2. 能用函数式就不用循环 | map/filter/reduce |
3. 区间用 ... 或 ..< |
避免 i++ |
4. 至少一次用 repeat-while |
防止空跑 |
| 5. 多层循环用标签 | 清晰跳出 |
你已完全掌握 Swift 循环!
回复关键词继续学习:
Swift 异步循环(async/await)Swift 并行 map(ConcurrentMap)Swift 循环优化技巧SwiftUI ForEach 原理
更多推荐


所有评论(0)