3-7.【函数式编程】什么是不可变数据结构?在 Swift 中如何实现?

2 阅读2分钟

1️⃣ 什么是不可变数据结构?

定义:不可变数据结构是指一旦创建,其内容 不能被修改 的数据结构。

  • 所有对数据的“修改”操作都会返回一个 新副本,而原数据保持不变。
  • 不可变结构在函数式编程中非常常见,因为它 避免了共享状态的副作用,更安全、线程安全。

特点

  1. 数据一旦创建就不可变
  2. 修改操作返回新对象
  3. 易于并发使用,无需加锁

示例对比

// 可变数组
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、Setlet 声明时就不可变。


方法 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:函数式集合库(第三方)

如果需要高性能的不可变数据结构(比如大数组、高频更新),可以使用第三方库,例如:


3️⃣ 不可变数据结构的优点

  1. 线程安全 → 不会被其他线程修改
  2. 易于调试 → 状态不可改变,减少隐藏 bug
  3. 函数式编程友好 → 可组合、可预测

4️⃣ 小结

  • 不可变数据结构 = 数据不可直接修改,每次“修改”都生成新副本

  • Swift 实现方式:

    1. let + 值类型数组/字典/集合
    2. 自定义 struct + 只读属性 + 返回新对象的方法
    3. 使用第三方函数式不可变集合库