Swift
集合类型
深入解析 Swift 三大集合类型:Array、Set 和 Dictionary。从基础操作到底层性能优化,助你编写高效、安全的 Swift 代码。
Swift 提供了三种主要的集合类型:Array(有序数组)、Set(无序集合)和 Dictionary(键值对字典)。它们均由泛型实现,具备严格的类型安全,并针对性能进行了深度优化。
Array (数组)
数组是有序的元素集合,允许重复值。
创建与访问
// 创建
var numbers: [Int] = [1, 2, 3]
var zeros = Array(repeating: 0, count: 3) // [0, 0, 0]
// 访问与修改
numbers.append(4)
numbers[0] = 10
let first = numbers[0] // 10遍历
for (index, value) in numbers.enumerated() {
print("Item \(index): \(value)")
}值语义与写时复制 (Copy-on-Write)
Swift 集合是值类型(Value Types)。但在底层,Swift 使用写时复制 (CoW) 技术优化性能。只有当确实发生修改时,才会执行实际的内存拷贝。
var a = [1, 2, 3]
var b = a // 此时 a 和 b 共享内存
b.append(4) // 此时 b 发生拷贝,a 保持不变Set (集合)
Set 是无序且不包含重复元素的集合。存储在 Set 中的类型必须遵循 Hashable 协议。
核心操作
Set 提供了强大的数学集合运算功能。
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let primeDigits: Set = [2, 3, 5, 7]
// 并集
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// 交集
oddDigits.intersection(evenDigits).sorted()
// []
// 差集
oddDigits.subtracting(primeDigits).sorted()
// [1, 9]Dictionary (字典)
字典存储键值对(Key-Value Pairs),键必须遵循 Hashable 协议。
操作与访问
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
// 访问(返回 Optional)
if let airportName = airports["DUB"] {
print("The name of the airport is \(airportName).")
}
// 修改
airports["LHR"] = "London" // 新增
airports["YYZ"] = "Toronto" // 更新
// 默认值访问
let airport = airports["XYZ", default: "Unknown"]集合协议与高阶函数
所有集合类型都遵循 Collection 和 Sequence 协议,支持丰富的高阶函数,如 map, filter, reduce。
let values = [1, 2, 3, 4, 5]
let squaredEvens = values
.filter { $0 % 2 == 0 }
.map { $0 * $0 }
// [4, 16]性能与并发 (Swift 6)
- 性能:Array 在尾部追加元素通常是 O(1),插入中间是 O(n)。Set 和 Dictionary 的查找、插入、删除平均复杂度为 O(1)。
- 并发安全:Swift 集合类型本身不是线程安全的。在并发环境中(如 Swift 6 的严格并发检查下),若需跨 Actor 传递集合,应确保元素类型是
Sendable的。值语义使得不可变集合(let)在并发访问时是天然安全的。
总结
熟练掌握 Array、Set 和 Dictionary 的特性及适用场景,是编写高质量 Swift 代码的基础。利用写时复制机制和高阶函数,可以在保证性能的同时,极大提升代码的表达力。
在 GitHub 上编辑
上次更新于