Swift: Swift 数组教程:创建、增删改查和遍历方法详解
数组就像购物清单,按顺序列出所有待办事项。本课带你掌握 Swift 数组的全部操作——从创建到增删改查,一网打尽。
1. 你将学到
- 创建数组的多种方式并指定元素类型
- 使用 append、insert、remove 增删元素
- 使用下标访问和修改数组元素
- 使用 for-in 和 enumerated 遍历数组
- 使用 isEmpty、count、contains 等实用属性
2. 一个电商开发者的真实故事
(1) 痛点:购物车列表管理混乱,数据不一致
Alice 在开发一个电商 App 的购物车功能。用户--Charlie--往购物车里加了 5 件商品,后来又删除 2 件、修改数量 3 次,最后结算时发现:购物车总价跟每件商品单价对不上! `swift // Alice 最初的"手动"管理方式 var cartItem1 = "Laptop" var cartItem2 = "Mouse" var cartItemPrice1 = 999.0 var cartItemPrice2 = 25.0 // 商品数量多了以后,她彻底崩溃了... Alice 用 12 个独立变量管理 6 件商品,添加第 7 件时变量名都不知道怎么取了。购物车数据分散在 20 多个变量中,改一个忘一个。
(2) 数组的解法
`swift var cartItems = ["Laptop", "Mouse", "Keyboard"] var cartPrices = [999.0, 25.0, 89.0] cartItems.append("Monitor") cartPrices.append(349.0) cartItems.remove(at: 1) cartPrices.remove(at: 1) print("Cart: (cartItems)") print("Total: $(cartPrices.reduce(0, +))")
(3) 收益:数据结构化,bug 减少 90%
| 维度 | 分散变量 | 数组管理 |
|---|---|---|
| 变量数量 | 18 个 | 2 个 |
| 添加商品 | 新建 3 个变量 | 1 行 append |
| 数据一致性 | 经常不同步 | 保证同步 |
| Bug 数量 | 3-5 个/周 | 0-1 个/周 |
3. 数组的创建与基本属性
数组是有序的元素集合,所有元素必须是同一类型。 `mermaid graph TB A[Array] --> B[Index 0] A --> C[Index 1] A --> D[Index 2] A --> E[Index ...] B --> F[Element] C --> F D --> F E --> F
| 创建方式 | 示例 | 说明 |
|---|---|---|
| 字面量 | [1, 2, 3] | 最常用 |
| 类型注解 | Int | 空数组 |
| 重复值 | Array(repeating: 0, count: 5) | 全 0 数组 |
| 区间转换 | Array(1...5) | 从区间创建 |
(1) 数组的创建
`swift // 方式 1:字面量 let numbers = [1, 2, 3, 4, 5] // 方式 2:空数组 var emptyArray: [String] = [] // 方式 3:重复值 let zeros = Array(repeating: 0, count: 3) print(zeros) // 方式 4:从区间 let rangeArray = Array(10...15) print(rangeArray)
(2) 常用属性
`swift let items = ["Apple", "Banana", "Orange"] print("Count: (items.count)") print("Is empty: (items.isEmpty)") print("First: (items.first ?? "None")") print("Last: (items.last ?? "None")") print("Contains Apple: (items.contains("Apple"))")
▶ 示例:商品库存盘点
`swift // ============================================ // 用数组管理仓库库存列表 // ============================================ var inventory: [String] = [] if inventory.isEmpty { print("Warehouse is empty, adding stock...") } inventory.append("Laptop") inventory.append("Mouse") inventory.append("Keyboard") inventory.append("Monitor") print("Inventory has (inventory.count) items") print("Products: (inventory.joined(separator: ", "))") print("First item: (inventory[0])") print("Last item: (inventory[inventory.count - 1])")
输出:
ext Warehouse is empty, adding stock... Inventory has 4 items Products: Laptop, Mouse, Keyboard, Monitor First item: Laptop Last item: Monitor
4. 数组的增删改查
数组是可变集合,支持在任意位置增删元素。
| 操作 | 方法 | 示例 |
|---|---|---|
| 尾部添加 | ppend(_:) | rray.append(4) |
| 指定位置插入 | insert(_:at:) | rray.insert(0, at: 0) |
| 删除指定位置 | ||
| emove(at:) | rray.remove(at: 2) | |
| 删除最后一个 | ||
| emoveLast() | rray.removeLast() | |
| 删除所有 | ||
| emoveAll() | rray.removeAll() | |
| 修改元素 | 下标赋值 | rray[1] = 100 |
(1) 添加和插入元素
`swift var tasks = ["Buy groceries", "Pay bills"] // 尾部添加 tasks.append("Call doctor") // 插入到指定位置 tasks.insert("Check email", at: 0) print(tasks)
(2) 删除和修改元素
`swift var scores = [88, 92, 75, 60, 95] // 修改 scores[1] = 98 // 删除 let removed = scores.remove(at: 3) print("Removed: (removed)") scores.removeLast() scores.sort() print(scores)
▶ 示例:待办事项管理
`swift // ============================================ // 用数组实现简单的待办事项列表 // ============================================ var todoList = ["Buy milk", "Walk dog", "Write report"] // 添加 todoList.append("Read book") todoList.insert("Morning exercise", at: 0) // 修改 todoList[2] = "Write weekly report" // 删除 let completed = todoList.remove(at: 1) print("Completed: (completed)") // 遍历 print("\n=== Today's Todo ===") for (i, task) in todoList.enumerated() { print("(i + 1). (task)") } print("\nRemaining tasks: (todoList.count)")
输出: ` ext Completed: Walk dog
=== Today's Todo ===
- Morning exercise
- Buy milk
- Write weekly report
- Read book
Remaining tasks: 4 `
5. 数组遍历与批量操作
Swift 提供了多种遍历数组的方式和实用的批量操作方法。
| 遍历方式 | 语法 | 使用场景 |
|---|---|---|
| 基本遍历 | or item in array | 只关心元素 |
| 带索引 | or (i, item) in array.enumerated() | 需要序号 |
| 条件过滤 | or item in array where condition | 只遍历符合条件的 |
| 高阶函数 | rray.map { } | 转换每个元素 |
| 筛选 | rray.filter { } | 筛选满足条件的元素 |
(1) 基本遍历和过滤遍历
`swift let numbers = [3, 7, 2, 8, 5, 1, 9, 4, 6] // 基本 for-in for num in numbers { print(num, terminator: " ") } print() // where 过滤 for num in numbers where num > 5 { print("(num) is greater than 5") }
(2) 高阶函数:map 和 filter
`swift let prices = [12.99, 24.50, 8.75, 35.00] // map: 每个价格加税 let withTax = prices.map { * 1.08 } print("With tax: (withTax)") // filter: 筛选超过 20 的商品 let expensive = prices.filter { > 20 } print("Expensive: (expensive)")
▶ 示例:订单数据分析
`swift // ============================================ // 用数组操作分析订单数据 // ============================================ let orderAmounts = [45.0, 120.0, 33.5, 299.0, 55.0, 180.0, 22.0] // 1. 计算总销售额 let total = orderAmounts.reduce(0, +) print("Total sales: $(total)") // 2. 筛选高价值订单(>= ) let highValue = orderAmounts.filter { >= 100 } print("High-value orders: (highValue.count)") // 3. 所有订单加 10% 服务费 let withServiceFee = orderAmounts.map { * 1.1 } print("First 3 with fee: (Array(withServiceFee.prefix(3)))") // 4. 排序 let sorted = orderAmounts.sorted(by: >) print("Top 3: (Array(sorted.prefix(3)))")
输出:
ext Total sales: .5 High-value orders: 3 First 3 with fee: [49.5, 132.0, 36.85] Top 3: [299.0, 180.0, 120.0]
6. 完整示例:购物车管理系统
`swift // ============================================ // 购物车管理系统 // 综合运用数组的 CRUD、遍历和高阶函数 // ============================================ import Foundation var cartItems: [String] = [] var cartPrices: [Double] = [] func addItem(name: String, price: Double) { cartItems.append(name) cartPrices.append(price) print("Added: (name) - $(price)") } func removeItem(at index: Int) { guard index >= 0 && index < cartItems.count else { print("Invalid index") return } let removed = cartItems.remove(at: index) cartPrices.remove(at: index) print("Removed: (removed)") } func updateQuantity(name: String, newPrice: Double) { if let index = cartItems.firstIndex(of: name) { cartPrices[index] = newPrice print("Updated: (name) -> $(newPrice)") } } func checkout() { guard !cartItems.isEmpty else { print("Cart is empty") return } print("\n=== Shopping Cart ===") var total = 0.0 for (i, item) in cartItems.enumerated() { let price = cartPrices[i] total += price print("(i + 1). (item) - $(String(format: "%.2f", price))") } let tax = total * 0.08 let grandTotal = total + tax print("---") print("Subtotal: $(String(format: "%.2f", total))") print("Tax (8%): $(String(format: "%.2f", tax))") print("Total: $(String(format: "%.2f", grandTotal))") let expensiveItems = cartPrices.enumerated().filter { .element > 100 } if !expensiveItems.isEmpty { print("\nHigh-value items:") for (i, _) in expensiveItems { print(" - (cartItems[i])") } } } addItem(name: "Laptop", price: 999.0) addItem(name: "Mouse", price: 25.0) addItem(name: "Keyboard", price: 89.0) addItem(name: "Monitor", price: 349.0) addItem(name: "USB Hub", price: 35.0) removeItem(at: 4) updateQuantity(name: "Mouse", newPrice: 22.5) checkout()
输出: ` ext Added: Laptop - .0 Added: Mouse - .0 Added: Keyboard - .0 Added: Monitor - .0 Added: USB Hub - .0 Removed: USB Hub Updated: Mouse -> .5
=== Shopping Cart ===
- Laptop - .00
- Mouse - .50
- Keyboard - .00
- Monitor - .00
Subtotal: .50 Tax (8%): .76 Total: .26
High-value items:
- Laptop
- Monitor `
❓ 常见问题
📖 小节
- 数组用 [Type] 表示,可以通过字面量、重复值或区间创建
- 常用操作方法:append、insert、remove、下标修改
- 数组是值类型,赋值时会复制副本
- 遍历方式包括基本 for-in、enumerated 带索引、where 过滤
- reduce、map、filter 等函数式方法让批量操作更简洁
- 访问数组元素前必须检查索引范围,避免越界崩溃
📝 作业
- 基础题: 创建一个包含 5 个城市名称的数组,用 for-in 遍历打印"我爱 [城市名]",每行一句。
- 进阶题: 写一个学生成绩管理系统:初始化一个分数数组 [78, 92, 55, 88, 73],实现添加新成绩、删除不及格成绩(<60)、计算平均分、找出最高分。
- 挑战题: 实现一个简单的"购物车推荐"功能。给定一个购物车数组 ["Laptop", "Mouse", "Keyboard"] 和一个推荐规则表(Laptop 推荐 Laptop Bag, Mouse 推荐 Mouse Pad, Keyboard 推荐 Wrist Rest),自动生成推荐商品列表并添加到购物车。要求不能重复添加已有商品。