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. breakcontinue

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...10stride
过滤转换 array.filter { }.map { }
累加/拼接 reduce
至少执行一次 repeat-while
跳出多层 break label

十一、常见错误 & 避坑

错误 正确做法
for i in 1..10 错误!应为 1..<101...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 原理

现在就用 map + filter + reduce 一行算出 1~100 的偶数平方和!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐