集合 #

一、集合概述 #

集合(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