Day6 重点攻克 Swift 中的 “循环”—— 这是让代码 “重复执行” 的核心能力,小到打印乘法表,大到处理 VisionPro 中的批量空间数据,都离不开循环。今天学了 for 循环(遍历数组 / 范围)、while 循环(未知次数场景),还有 continue/break 控制循环流程,最后用经典的 “FizzBuzz” 练习巩固了所有知识点。整理了实操代码、场景对比和避坑点,新手朋友可以跟着练,感受不同循环的适用场景~

目录

一、最常用的循环:for 循环,处理 “已知范围 / 集合”

1. 遍历集合(数组 / 集合 / 字典)

2. 遍历数字范围:闭区间 ... 与半开区间 ..<

3. 嵌套循环:循环里套循环

4. 忽略循环变量:用 _ 代替不用的变量

二、未知次数的循环:while 循环,直到条件不满足

1. 基础用法:条件为真就循环

2. 实战场景:结合随机数,直到满足条件

三、循环控制:continue 跳过当前,break 终止全部

1. continue:跳过当前迭代,继续下一次

2. break:终止整个循环,不再执行后续迭代

四、经典练习:FizzBuzz,综合运用循环与条件

五、Day6 总结:不同循环的适用场景

明日计划


 

一、最常用的循环:for 循环,处理 “已知范围 / 集合”

for 循环的核心是 “知道要循环多少次”,比如遍历数组的每个元素、循环固定次数,语法简洁且不易出错。

1. 遍历集合(数组 / 集合 / 字典)

遍历数组时,for-in 会自动把每个元素赋值给 “循环变量”,不用手动管理索引,特别省心:

// 遍历字符串数组,打印每个平台的适配信息
let platforms = ["iOS", "macOS", "tvOS", "watchOS"]
for os in platforms {
    print("Swift works great on \(os).")
}
// 输出结果:
// Swift works great on iOS.
// Swift works great on macOS.
// ...
  • 关键概念
    • os 是 “循环变量”,仅在循环体内可用,每次迭代会变成数组的下一个元素;
    • 花括号内的代码是 “循环体”,每次迭代执行一次;
    • 遍历集合、字典时语法类似(字典需用 for (key, value) in dict)。

2. 遍历数字范围:闭区间 ... 与半开区间 ..<

处理 “固定次数” 的循环时,用范围语法最直观,Swift 支持两种范围:

// 1. 闭区间 `x...y`:包含 x 和 y(比如 1...4 是 1、2、3、4)
print("5倍乘法表:")
for i in 1...4 {
    print("5 * \(i) = \(5*i)")
}
// 输出:5*1=5、5*2=10、5*3=15、5*4=20

// 2. 半开区间 `x..<y`:包含 x,不包含 y(比如 1..<4 是 1、2、3)
print("\n半开区间遍历:")
for i in 1..<4 {
    print(i)  // 输出 1、2、3
}

实用场景:遍历数组索引时,半开区间 0..<array.count 最安全(因为数组索引从 0 到 count-1,不会越界)。

3. 嵌套循环:循环里套循环

处理 “多维数据” 时需要嵌套循环,比如打印乘法表:

// 打印 1-4 的乘法表
for i in 1...4 {
    print("第 \(i) 乘法表:")
    for j in 1...4 {  // 内层循环,遍历乘数
        print("  \(j) x \(i) = \(j*i)")
    }
    print()  // 每个乘法表后空一行,优化输出格式
}
  • 注意:嵌套层数越多,代码越复杂,尽量控制在 2 层以内(如需更多,考虑后续学的 “函数拆分”)。

4. 忽略循环变量:用 _ 代替不用的变量

如果循环只需要 “执行次数”,不需要循环变量(比如重复拼接字符串),用 _ 忽略变量,代码更清晰:

var lyric = "Haters gonna"
for _ in 1...5 {  // _ 表示“这个变量不用管”
    lyric += " hate"  // 重复拼接 5 次 " hate"
}
print(lyric)  // 输出 Haters gonna hate hate hate hate hate

二、未知次数的循环:while 循环,直到条件不满足

while 循环的核心是 “不知道要循环多少次,只知道终止条件”,比如随机掷骰子直到掷出 20 点、等待网络请求返回等场景。

1. 基础用法:条件为真就循环

// 倒计时:从 10 数到 1,然后输出“发射”
var countdown = 10
while countdown > 0 {  // 条件:countdown 大于 0 时循环
    print("\(countdown)…")
    countdown -= 1  // 每次循环减 1,避免死循环
}
print("Blast off!")
// 输出:10… 9… ... 1… Blast off!
  • 避坑重点:必须在循环体内修改 “条件相关变量”(比如 countdown -= 1),否则条件永远为真,会陷入 “死循环”(Xcode 会卡住,需强制停止)。

2. 实战场景:结合随机数,直到满足条件

Int.random(in: 范围) 能生成随机整数,配合 while 循环可实现 “直到掷出目标点数” 的逻辑:

var roll = 0  // 初始骰子点数为 0
while roll != 20 {  // 条件:点数不等于 20 就继续掷
    roll = Int.random(in: 1...20)  // 随机生成 1-20 的点数
    print("I rolled a \(roll)")
}
print("Critical hit!")  // 掷出 20 点,循环结束
  • 小知识Double.random(in: 0...1) 可生成 0 到 1 的随机小数,后续做 “概率判断”(比如 30% 几率触发某个事件)会用到。

三、循环控制:continue 跳过当前,break 终止全部

有时候需要 “跳过某些迭代” 或 “提前终止循环”,continue 和 break 就是专门的控制工具,用在 for 和 while 循环中都有效。

1. continue:跳过当前迭代,继续下一次

比如遍历文件列表,只处理 .jpg 格式的文件,其他格式跳过:

let filenames = ["me.jpg", "work.txt", "sophie.jpg", "logo.psd"]
for filename in filenames {
    if filename.hasSuffix(".jpg") == false {  // 不是 .jpg 格式
        continue  // 跳过当前迭代,不执行后面的 print
    }
    print("Found picture: \(filename)")  // 只打印 .jpg 文件
}
// 输出:Found picture: me.jpg、Found picture: sophie.jpg

2. break:终止整个循环,不再执行后续迭代

比如找两个数字的前 10 个公倍数,找到后直接终止循环,不用遍历到 100000:

let number1 = 4
let number2 = 14
var multiples = [Int]()  // 存储公倍数的数组

for i in 1...100_000 {
    if i.isMultiple(of: number1) && i.isMultiple(of: number2) {
        multiples.append(i)  // 找到公倍数,加入数组
        if multiples.count == 10 {  // 够 10 个了
            break  // 终止整个循环,不用继续遍历
        }
    }
}
print(multiples)  // 输出前 10 个公倍数
  • 优势break 能减少不必要的循环,提升代码效率(比如上面的例子,不用遍历到 100000 就能提前结束)。

四、经典练习:FizzBuzz,综合运用循环与条件

今天的练习是编程界经典的 “FizzBuzz”:遍历 1-100 的数字,能被 3 和 5 整除输出 “FizzBuzz”,能被 3 整除输出 “Fizz”,能被 5 整除输出 “Buzz”,否则输出数字。

for i in 1...100 {
    if i.isMultiple(of: 3) && i.isMultiple(of: 5) {
        print("i 应该输出 FizzBuzz")
    } else {
        if i.isMultiple(of: 3) {
            print("i 应该输出 Fizz")
        } else if i.isMultiple(of: 5) {
            print("i 应该输出 Buzz")
        } else {
            print("i 应该输出 \(i)")
        }
    }
}
  • 思路拆解:先判断 “最严格的条件”(能被 3 和 5 整除),再依次判断单个条件,避免逻辑覆盖错误(如果先判断能被 3 整除,会导致能被 15 整除的数字只输出 “Fizz”)。

五、Day6 总结:不同循环的适用场景

循环类型 适用场景 优势 注意点
for-in 遍历集合(数组 / 字典)、固定次数循环 不用管理索引,代码简洁 循环变量仅在体内可用
while 未知循环次数,仅知道终止条件 灵活处理 “等待某个条件满足” 的场景 必须修改条件变量,避免死循环
continue 跳过当前迭代,继续下一次 过滤不需要处理的元素 不终止循环,只是跳过当前次
break 提前终止整个循环 减少不必要迭代,提升效率 终止后不再执行后续任何迭代

明日计划

Day7 要学 Swift 的 “函数基础”—— 把重复的代码(比如 FizzBuzz 逻辑、数组遍历逻辑)封装成函数,后续调用时不用重复写代码,还能让代码更模块化。有一起打卡的朋友吗?评论区可以分享你用循环实现的小功能(比如打印菱形、计算 1-100 的和)~

 

更多推荐