集合 #
一、集合概述 #
集合(Set)是存储唯一值的无序集合,适合需要去重或集合运算的场景。
1.1 集合特点 #
- 无序集合
- 元素唯一
- 快速查找(O(1))
- 值类型(复制时创建副本)
1.2 Hashable协议 #
集合元素必须遵循 Hashable 协议:
swift
struct Person: Hashable {
let name: String
let age: Int
}
let people: Set<Person> = [
Person(name: "张三", age: 25),
Person(name: "李四", age: 30)
]
二、创建集合 #
2.1 空集合 #
swift
var emptySet: Set<Int> = []
var emptySet2 = Set<Int>()
var emptySet3 = Set<String>()
print(emptySet.isEmpty)
2.2 集合字面量 #
swift
let numbers: Set<Int> = [1, 2, 3, 4, 5]
let fruits: Set<String> = ["苹果", "香蕉", "橙子"]
print(numbers)
print(fruits)
2.3 从数组创建 #
swift
let array = [1, 2, 2, 3, 3, 3, 4, 4, 5]
let uniqueSet = Set(array)
print(uniqueSet)
2.4 注意类型推断 #
swift
let numbers: Set = [1, 2, 3]
let array = [1, 2, 3]
print(type(of: numbers))
print(type(of: array))
三、访问元素 #
3.1 检查元素 #
swift
let fruits: Set = ["苹果", "香蕉", "橙子"]
print(fruits.contains("苹果"))
print(fruits.contains("葡萄"))
3.2 集合属性 #
swift
let fruits: Set = ["苹果", "香蕉", "橙子"]
print(fruits.count)
print(fruits.isEmpty)
if let first = fruits.first {
print(first)
}
3.3 遍历集合 #
swift
let fruits: Set = ["苹果", "香蕉", "橙子"]
for fruit in fruits {
print(fruit)
}
for fruit in fruits.sorted() {
print(fruit)
}
四、修改集合 #
4.1 添加元素 #
swift
var fruits: Set = ["苹果", "香蕉"]
fruits.insert("橙子")
print(fruits)
fruits.insert("苹果")
print(fruits)
4.2 删除元素 #
swift
var fruits: Set = ["苹果", "香蕉", "橙子"]
let removed = fruits.remove("香蕉")
print(removed ?? "未找到")
print(fruits)
if let first = fruits.popFirst() {
print("移除: \(first)")
}
print(fruits)
fruits.removeAll()
print(fruits)
4.3 更新元素 #
swift
var numbers: Set = [1, 2, 3]
let inserted = numbers.insert(3)
print(inserted.inserted)
print(inserted.memberAfterInsert)
let updated = numbers.update(with: 4)
print(updated ?? "nil")
print(numbers)
五、集合运算 #
5.1 并集(union) #
swift
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5, 6]
let union = a.union(b)
print(union)
var c: Set = [1, 2]
c.formUnion([2, 3, 4])
print(c)
5.2 交集(intersection) #
swift
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5, 6]
let intersection = a.intersection(b)
print(intersection)
var c: Set = [1, 2, 3, 4]
c.formIntersection([2, 3, 5])
print(c)
5.3 差集(subtracting) #
swift
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5, 6]
let difference = a.subtracting(b)
print(difference)
var c: Set = [1, 2, 3, 4]
c.subtract([2, 3])
print(c)
5.4 对称差集(symmetricDifference) #
swift
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5, 6]
let symmetricDiff = a.symmetricDifference(b)
print(symmetricDiff)
var c: Set = [1, 2, 3, 4]
c.formSymmetricDifference([2, 3, 5])
print(c)
六、集合比较 #
6.1 相等 #
swift
let a: Set = [1, 2, 3]
let b: Set = [3, 2, 1]
let c: Set = [1, 2, 3, 4]
print(a == b)
print(a == c)
6.2 子集(isSubset) #
swift
let a: Set = [1, 2, 3]
let b: Set = [1, 2, 3, 4, 5]
print(a.isSubset(of: b))
print(a.isStrictSubset(of: b))
print(b.isSuperset(of: a))
print(b.isStrictSuperset(of: a))
6.3 相交(isDisjoint) #
swift
let a: Set = [1, 2, 3]
let b: Set = [4, 5, 6]
let c: Set = [3, 4, 5]
print(a.isDisjoint(with: b))
print(a.isDisjoint(with: c))
七、集合操作 #
7.1 filter #
swift
let numbers: Set = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)
7.2 map #
swift
let numbers: Set = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled)
7.3 reduce #
swift
let numbers: Set = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0, +)
print(sum)
7.4 forEach #
swift
let fruits: Set = ["苹果", "香蕉", "橙子"]
fruits.forEach { print($0) }
八、实际应用 #
8.1 数组去重 #
swift
let numbers = [1, 2, 2, 3, 3, 3, 4, 4, 5]
let unique = Array(Set(numbers))
print(unique)
let orderedUnique = Array(Set(numbers)).sorted()
print(orderedUnique)
8.2 查找重复元素 #
swift
let numbers = [1, 2, 2, 3, 3, 3, 4, 4, 5]
var seen = Set<Int>()
var duplicates = Set<Int>()
for number in numbers {
if seen.contains(number) {
duplicates.insert(number)
} else {
seen.insert(number)
}
}
print("重复元素: \(duplicates)")
8.3 标签系统 #
swift
struct Article {
let title: String
let tags: Set<String>
}
let articles = [
Article(title: "Swift入门", tags: ["Swift", "iOS", "编程"]),
Article(title: "Python教程", tags: ["Python", "编程", "后端"]),
Article(title: "iOS开发", tags: ["iOS", "Swift", "移动端"])
]
func search(articles: [Article], withTags tags: Set<String>) -> [Article] {
return articles.filter { !$0.tags.isDisjoint(with: tags) }
}
let results = search(articles: articles, withTags: ["Swift", "iOS"])
results.forEach { print($0.title) }
8.4 权限管理 #
swift
struct Permission: Hashable {
let name: String
}
class User {
var permissions: Set<Permission> = []
func grant(_ permission: Permission) {
permissions.insert(permission)
}
func revoke(_ permission: Permission) {
permissions.remove(permission)
}
func has(_ permission: Permission) -> Bool {
return permissions.contains(permission)
}
func hasAny(_ permissions: Set<Permission>) -> Bool {
return !self.permissions.isDisjoint(with: permissions)
}
func hasAll(_ permissions: Set<Permission>) -> Bool {
return self.permissions.isSuperset(of: permissions)
}
}
let user = User()
user.grant(Permission(name: "read"))
user.grant(Permission(name: "write"))
print(user.has(Permission(name: "read")))
print(user.has(Permission(name: "delete")))
8.5 缓存键 #
swift
class Cache {
private var cache: [String: Any] = [:]
private var keys: Set<String> = []
func set(_ value: Any, forKey key: String) {
cache[key] = value
keys.insert(key)
}
func get(_ key: String) -> Any? {
return cache[key]
}
func has(_ key: String) -> Bool {
return keys.contains(key)
}
func clear() {
cache.removeAll()
keys.removeAll()
}
}
九、Set扩展 #
9.1 添加元素操作符 #
swift
extension Set {
static func += (lhs: inout Set, rhs: Element) {
lhs.insert(rhs)
}
static func += (lhs: inout Set, rhs: Set) {
lhs.formUnion(rhs)
}
}
var numbers: Set = [1, 2, 3]
numbers += 4
numbers += [5, 6]
print(numbers)
9.2 判断是否为空 #
swift
extension Set {
var isNotEmpty: Bool {
return !isEmpty
}
}
let numbers: Set = [1, 2, 3]
if numbers.isNotEmpty {
print("集合不为空")
}
十、总结 #
本章学习了Swift集合:
- 创建:字面量、初始化器
- 操作:insert、remove、contains
- 集合运算:union、intersection、subtracting
- 比较:子集、超集、相交
最佳实践:
- 需要去重时使用Set
- 需要快速查找时使用Set
- 使用集合运算简化代码
- 元素必须遵循Hashable协议
下一章,我们将学习函数!
最后更新:2026-03-26