Swift 数组(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

(注:根据要求,此处一级标题仅用于格式规范,实际输出将从二级标题开始)

前言

在编程世界中,数据的组织与操作是解决问题的核心。Swift 语言中的 Swift 数组作为最基本的集合类型之一,就像程序员手中的瑞士军刀——简单却功能强大。无论是管理购物车的商品列表、存储用户输入的多个值,还是处理复杂的数据分析任务,数组都是不可或缺的工具。本文将从零开始,逐步解析 Swift 数组的语法、特性与应用场景,帮助开发者构建扎实的数组使用能力。


一、数组的定义与基础操作

1.1 数组的创建与初始化

数组(Array)是一种有序的、可变的集合类型,用于存储同一类型的多个值。在 Swift 中,创建数组的语法简洁直观:

// 声明一个可变数组(类型推断)
var fruits = ["Apple", "Banana", "Orange"]  

// 显式声明类型(适用于类型不明确的情况)
var numbers: [Int] = [1, 2, 3, 4]  

关键点解释

  • var 表示数组是可变的,可以添加或删除元素;
  • [T] 是数组的泛型语法,T 表示元素类型(如 StringInt);
  • 如果初始化时未赋值,可使用 emptyArray 或默认初始化:
    var emptyArray = [String]()  
    

1.2 数组的基本操作:增、删、改、查

添加元素

通过 append()+= 运算符向数组末尾追加元素:

fruits.append("Grape")  
fruits += ["Mango"]  

删除元素

使用 remove(at:) 移除指定索引的元素,或 removeAll() 清空数组:

fruits.remove(at: 0) // 移除第一个元素"Apple"  
fruits.removeAll()   // 清空数组  

访问与修改元素

通过索引(从 0 开始)访问或修改元素:

let firstFruit = fruits[0] // 获取第一个元素  
fruits[1] = "Pineapple"    // 修改第二个元素  

注意:索引越界会导致运行时错误,因此建议使用安全访问方法(如 if letguard):

if fruits.indices.contains(5) {  
    print(fruits[5])  
} else {  
    print("索引超出范围")  
}  

1.3 数组的遍历

遍历数组常用 for-in 循环或 indices 属性:

// 直接遍历元素  
for fruit in fruits {  
    print(fruit)  
}  

// 通过索引遍历  
for i in fruits.indices {  
    print("索引 \(i): \(fruits[i])")  
}  

二、数组的高级特性

2.1 可变性与不可变数组

通过 varlet 可以控制数组的可变性:

let immutableArray = ["Red", "Green", "Blue"] // 不可变数组  
// immutableArray.append("Yellow") // 编译错误!  

var mutableArray = ["Red", "Green", "Blue"]  
mutableArray.append("Yellow") // 允许修改  

2.2 数组的合并与切片

合并数组可通过 + 运算符或 append(contentsOf:)

let colors = ["Red", "Green"] + ["Blue"]  
let extendedColors = colors + ["Yellow", "Purple"]  

var numbers = [1, 2, 3]  
numbers.append(contentsOf: [4, 5, 6]) // 结果为 [1,2,3,4,5,6]  

切片操作允许提取子数组:

let numbers = [1, 2, 3, 4, 5]  
let subArray = numbers[1...3] // 结果为 [2, 3, 4]  

2.3 嵌套数组与多维数据

数组可以嵌套,形成多维数据结构:

let matrix: [[Int]] = [  
    [1, 2, 3],  
    [4, 5, 6],  
    [7, 8, 9]  
]  
print(matrix[0][1]) // 输出 2  

三、数组的性能与内存管理

3.1 数组的动态扩容机制

Swift 数组采用 动态扩容 策略:初始容量不足时,系统会自动分配更大的内存空间。例如:

var smallArray = [Int](repeating: 0, count: 2) // 初始容量为2  
for _ in 0..<10 {  
    smallArray.append(0) // 超过容量后自动扩容  
}  

3.2 避免频繁插入与删除

在频繁插入或删除元素时,数组的性能可能下降(尤其是中间位置的操作)。此时,可考虑使用 LinkedListDeque 等其他数据结构。


四、常见错误与解决方案

4.1 索引越界问题

错误示例

let arr = ["A", "B"]  
print(arr[2]) // 运行时崩溃!  

解决方案

  • 使用 if letguard 检查索引是否存在;
  • 使用 firstlast 等属性替代直接索引访问:
    if let lastElement = arr.last {  
        print(lastElement)  
    }  
    

4.2 类型不匹配错误

数组必须存储相同类型元素。若需混合类型,可使用 AnyAnyObject

var mixedArray: [Any] = ["Text", 42, 3.14] // 允许不同类型  

五、实战案例:购物车功能实现

5.1 场景描述

假设需要实现一个简单的购物车,支持添加商品、删除商品、计算总价等功能。

5.2 代码实现

// 定义商品结构体  
struct Product {  
    let name: String  
    let price: Double  
}  

// 创建购物车(数组)  
var cart: [Product] = []  

// 添加商品  
let apple = Product(name: "Apple", price: 1.99)  
cart.append(apple)  

// 计算总价  
func calculateTotal() -> Double {  
    return cart.reduce(0.0) { $0 + $1.price }  
}  

// 删除商品(通过索引)  
if cart.indices.contains(0) {  
    cart.remove(at: 0)  
}  

5.3 扩展功能:过滤与排序

// 过滤价格高于5元的商品  
let expensiveItems = cart.filter { $0.price > 5 }  

// 按价格升序排序  
cart.sort { $0.price < $1.price }  

六、进阶技巧与最佳实践

6.1 使用 mapfilter 等高阶函数

数组支持链式调用,提升代码简洁性:

let evenNumbers = [1,2,3,4,5]  
    .filter { $0 % 2 == 0 }  
    .map { "\($0) is even" }  
// 结果为 ["2 is even", "4 is even"]  

6.2 与 Dictionary 的结合使用

通过数组与字典的组合,可实现更复杂的数据管理:

var inventory: [String: Int] = [:]  
let items = ["Apple", "Banana", "Apple"]  

for item in items {  
    inventory[item, default: 0] += 1  
}  
// inventory 结果为 ["Apple": 2, "Banana": 1]  

结论

Swift 数组作为 Swift 开发的核心工具,其简洁的语法与强大的功能为开发者提供了高效的数据管理能力。从基础操作到高级技巧,掌握数组的使用不仅能提升代码效率,还能为后续学习集合类型(如字典、集合)打下坚实基础。

在实际开发中,建议开发者结合具体场景选择最佳实践:例如,通过 guard 语句避免索引错误,利用高阶函数简化逻辑,或通过嵌套数组处理多维数据。希望本文能帮助你更好地驾驭 Swift 数组,在开发道路上走得更远。

(全文约 1800 字)

最新发布