【swift开发基础】33 | 访问和操作数组 - 遍历和索引
2026年1月16日 23:55
一、访问和操作数组
1. 数组遍历
1)for-in循环
- 基本用法:通过for num in numbers形式遍历数组元素,是Swift中最基础的遍历方式
- 控制流支持:完整支持break和continue控制语句,可以灵活控制循环流程
2)forEach方法
-
语法特点:采用闭包形式numbers.forEach { num in ... }进行遍历
-
控制限制:
- break/continue:无法使用这两个控制语句跳出或跳过循环
- return行为:仅退出当前闭包执行体,不会终止整个遍历过程
-
示例说明:当尝试在num == 3时执行break会导致编译错误,改为return则只会跳过数字3的输出
3)同时得到索引和值
-
enumerated()方法:
- 返回(index, value)元组序列
- 示例:for (index, num) in numbers.enumerated()
-
替代方案:可通过0..<numbers.count区间遍历索引,再通过下标访问值
-
推荐实践:相比手动索引访问,更推荐使用enumerated()方法,代码更简洁清晰
4)使用Iterator遍历数组
-
实现步骤:
- 通过makeIterator()获取迭代器
- 使用while let配合next()方法遍历
-
终止条件:当next()返回nil时循环自动结束
-
适用场景:适合需要自定义遍历逻辑的情况,但日常开发中使用频率较低
2. 索引
1)startIndex
- 特性:始终返回0,表示数组第一个元素的位置
- 空数组情况:当数组为空时,startIndex等于endIndex
2)endIndex
- 定义:返回最后一个元素索引+1的位置
- 等价关系:对于数组而言等同于count属性值
- 特殊说明:与String不同,数组的索引都是Int类型
3)indices
- 功能:返回数组的有效索引区间(Range)
- 遍历应用:可通过for i in numbers.indices形式遍历所有有效索引
- 优势:比手动指定0..<count更安全可靠
3. 代码示例
1)forEach方法应用
-
基础输出:成功输出数组[2,3,4,5,6,7]所有元素
-
控制尝试:
- break/continue会导致编译错误
- return仅跳过当前元素(如跳过数字3)
2)enumerated方法应用
- 输出格式:同时打印索引和元素值(如"the index is: 0 2")
- 数值处理:示例中将元素值乘以10后输出
3)使用iterator遍历数组
- 迭代过程:通过while let num = it.next()持续获取下一个元素
- 终止机制:当next()返回nil时自动结束循环
4)使用索引区间遍历
- 实现方式:for i in numbers.indices配合下标访问
- 输出效果:与enumerated()方法输出结果相同
4. 最佳实践建议
- 简单遍历:仅需元素值时优先使用for-in循环
- 索引需求:需要同时访问索引和值时推荐使用enumerated()方法
- 性能考虑:避免在循环体内进行不必要的数组操作,保持遍历高效性
二、知识小结
| 知识点 | 核心内容 | 易混淆点/注意事项 | 代码示例 |
|---|---|---|---|
| for-in循环 | 基础遍历方式,可配合break/continue控制流程 | 与forEach方法的关键区别在于流程控制 | for number in numbers { ... } |
| forEach方法 | 闭包式遍历,语法简洁 | 不支持break/continue,return仅退出当前闭包 | numbers.forEach { if$0 == 3 { return } } |
| enumerated() | 同时获取索引(index)和值(value) | 等效于for i in 0..<count但更优雅 | for (index, num) in numbers.enumerated() |
| 迭代器遍历 | 通过makeIterator()和while let组合实现 | 需手动处理迭代终止条件(nil) | while let num = numbers.makeIterator().next() |
| 索引属性 | startIndex=0,endIndex=count | 空数组时startIndex == endIndex | numbers.indices返回索引区间 |
| 索引区间遍历 | 使用indices属性获取合法索引范围 | 与显式写0..<count效果相同 | for i in numbers.indices { numbers[i] } |