Swift: Swift 数组教程:创建、增删改查和遍历方法详解

数组就像购物清单,按顺序列出所有待办事项。本课带你掌握 Swift 数组的全部操作——从创建到增删改查,一网打尽。

1. 你将学到


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 ===

  1. Morning exercise
  2. Buy milk
  3. Write weekly report
  4. 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 ===

  1. Laptop - .00
  2. Mouse - .50
  3. Keyboard - .00
  4. Monitor - .00

Subtotal: .50 Tax (8%): .76 Total: .26

High-value items:

  • Laptop
  • Monitor `

❓ 常见问题

Q 数组越界访问会发生什么?
A 程序会崩溃(runtime error)。所以在用下标访问前,一定要确保 index < array.count,或者用 indices.contains(index) 检查。
Q append 和 insert 在性能上有什么区别?
A append 是 O(1) 操作(尾部添加)。insert 是 O(n) 操作(需要移动后面的元素)。频繁在头部插入用其他数据结构(如链表)。
Q 数组是值类型还是引用类型?
A Array 是值类型(struct)。赋值给新变量时会复制一份副本,修改副本不影响原数组。
Q 如何合并两个数组?
A 用 + 运算符:let combined = array1 + array2。也可以用 ppend(contentsOf:) 方法在一个数组后追加另一个数组的全部元素。
Q 数组的 removeAll 能释放内存吗?
A emoveAll() 清除元素但保持容量。如果想同时释放内存,用 emoveAll(keepingCapacity: false)。

📖 小节


📝 作业

  1. 基础题: 创建一个包含 5 个城市名称的数组,用 for-in 遍历打印"我爱 [城市名]",每行一句。
  2. 进阶题: 写一个学生成绩管理系统:初始化一个分数数组 [78, 92, 55, 88, 73],实现添加新成绩、删除不及格成绩(<60)、计算平均分、找出最高分。
  3. 挑战题: 实现一个简单的"购物车推荐"功能。给定一个购物车数组 ["Laptop", "Mouse", "Keyboard"] 和一个推荐规则表(Laptop 推荐 Laptop Bag, Mouse 推荐 Mouse Pad, Keyboard 推荐 Wrist Rest),自动生成推荐商品列表并添加到购物车。要求不能重复添加已有商品。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏