1️⃣ 什么是不可变数据结构?
定义:不可变数据结构是指一旦创建,其内容 不能被修改 的数据结构。
- 所有对数据的“修改”操作都会返回一个 新副本,而原数据保持不变。
- 不可变结构在函数式编程中非常常见,因为它 避免了共享状态的副作用,更安全、线程安全。
特点:
- 数据一旦创建就不可变
- 修改操作返回新对象
- 易于并发使用,无需加锁
示例对比:
// 可变数组
var arr = [1, 2, 3]
arr.append(4) // arr 变成 [1, 2, 3, 4]
// 不可变数组
let arr2 = [1, 2, 3]
// arr2.append(4) // ❌ 编译错误,无法修改
2️⃣ 在 Swift 中实现不可变数据结构
方法 1:使用 let 声明
最简单的不可变结构就是使用 let:
let numbers = [1, 2, 3]
let newNumbers = numbers + [4] // 返回新数组
print(numbers) // [1, 2, 3] 原数组未变
print(newNumbers) // [1, 2, 3, 4]
- 原数组
numbers保持不变 - 新数组
newNumbers是修改后的副本
说明:Swift 的 Array、Dictionary、Set 在
let声明时就不可变。
方法 2:使用 struct 和只读属性
Swift 的 struct 默认是值类型(Value Type),每次修改都会创建副本:
struct Person {
let name: String
let age: Int
func birthday() -> Person {
return Person(name: name, age: age + 1)
}
}
let alice = Person(name: "Alice", age: 25)
let olderAlice = alice.birthday()
print(alice.age) // 25
print(olderAlice.age) // 26
- 原对象
alice不变 birthday()返回新对象olderAlice
方法 3:函数式集合库(第三方)
如果需要高性能的不可变数据结构(比如大数组、高频更新),可以使用第三方库,例如:
- Swift Collections 提供
OrderedSet、Deque等不可变版本 - swift-immutable 提供持久化不可变数组、字典等
3️⃣ 不可变数据结构的优点
- 线程安全 → 不会被其他线程修改
- 易于调试 → 状态不可改变,减少隐藏 bug
- 函数式编程友好 → 可组合、可预测
4️⃣ 小结
-
不可变数据结构 = 数据不可直接修改,每次“修改”都生成新副本
-
Swift 实现方式:
let+ 值类型数组/字典/集合- 自定义
struct+ 只读属性 + 返回新对象的方法 - 使用第三方函数式不可变集合库