Swift — 集合(Set)

在 Swift 中,Set 是一个无序的集合类型,用来存储唯一、不可重复的值。与数组 (Array) 不同,Set 的元素没有固定顺序,同时保证每个元素的值是唯一的,且其操作效率非常高(基于哈希表)。

以下是 Swift Set 集合 的常用接口和功能介绍,按功能分类。


1. Set 的基本属性与信息 #

属性或方法功能说明示例
count返回集合中元素的数量。print(set.count)
isEmpty检查集合是否为空,返回 truefalseif set.isEmpty { print("Empty Set") }
contains(_:)检查集合是否包含指定的值,返回 truefalseif set.contains(5) { print("Found in Set") }
first返回集合中的一个元素(无特定顺序,类型为可选)。let value = set.first

2. 创建 Set #

方法功能说明示例
使用数组初始化通过数组初始化 Set,自动去重。let set: Set = [1, 2, 2, 3, 4] // {1, 2, 3, 4}
直接创建空集合创建一个空的 Set,需要显式声明元素类型以便编译器推断类型。var set = Set<Int>()
使用集合字面量通过集合字面量创建 Set。let set: Set = ["apple", "banana"]
init()创建一个空的 Set,适用对后续动态添加元素的场景。let set = Set<String>()

3. 添加与移除元素 #

方法功能说明示例
insert(_:)向集合中插入一个元素。如果元素已存在,则集合不会发生变化,返回插入结果。set.insert(5)
remove(_:)删除指定的元素。如果元素不存在,则返回 nillet removed = set.remove(5)
removeAll()清空集合中的所有元素,将集合变为空集。set.removeAll()

4. 遍历 #

方法名称功能说明示例
forEach(_:)遍历集合中的每个元素,按无特定顺序执行代码块(闭包)。set.forEach { print($0) }
for-in使用 for-in 遍历集合,按无特定顺序输出每个元素。for item in set { print(item) }

5. 集合操作 #

方法名称功能说明示例
union(_:)返回当前集合与指定集合的并集(去重)。不会修改原 Set。let unionSet = set1.union(set2)
formUnion(_:)原地对集合执行并集操作,直接将另外集合中的元素合并到当前集合中。set1.formUnion(set2)
intersection(_:)返回当前集合与指定集合的交集(只保留两边都包含的元素)。let intersectionSet = set1.intersection(set2)
formIntersection(_:)原地对集合执行交集操作,将当前集合修改为与指定集合的交集。set1.formIntersection(set2)
subtracting(_:)返回当前集合去除指定集合中的元素后的差集。let differenceSet = set1.subtracting(set2)
subtract(_:)原地对集合执行差集操作,直接移除指定集合中的所有元素。set1.subtract(set2)
symmetricDifference(_:)返回当前集合与指定集合的对称差集(只保留在一个集合中存在的元素)。let symmetricSet = set1.symmetricDifference(set2)

6. 查询相关 #

方法名称功能说明示例
isSubset(of:)检查当前集合是否是指定集合的子集,返回 truefalseif set.isSubset(of: otherSet) { ... }
isSuperset(of:)检查当前集合是否是指定集合的超集,返回 truefalseif set.isSuperset(of: otherSet) { ... }
isDisjoint(with:)检查两个集合是否无交集,返回 truefalseif set.isDisjoint(with: otherSet) { ... }
contains(_:)检查集合中是否包含指定元素,返回 truefalseif set.contains(3) { print("Found") }

7. 排序与随机化 #

方法功能说明示例
sorted()返回集合按升序排序后的数组。let sortedArray = set.sorted()
shuffled()返回集合随机排列的数组。let shuffledArray = set.shuffled()

8. 类型转换 #

方法功能说明示例
转换为 Array将 Set 转换为 Array 类型。let arrayFromSet = Array(set)
Set 构造初始化 Array从数组初始化集合去重,并保持唯一性。let setFromArray = Set(array)

9. Set 的比较 #

方法功能说明示例
==判断两个集合是否完全相等(值相同且数量相等)。if set1 == set2 { print("Equal") }
!=判断两个集合是否不相等。if set1 != set2 { print("Not Equal") }

10. 示例代码 #

1. 基本操作:创建、插入、删除 #

var numbers: Set = [1, 2, 3, 4]
numbers.insert(5) // 插入元素
numbers.remove(2) // 移除元素
print(numbers) // 输出: {3, 4, 1, 5}(顺序可能不同)

2. 集合操作:并集、交集、差集 #

let setA: Set = [1, 2, 3, 4]
let setB: Set = [3, 4, 5, 6]

// 获取并集
let unionSet = setA.union(setB) // {1, 2, 3, 4, 5, 6}

// 获取交集
let intersectionSet = setA.intersection(setB) // {3, 4}

// 获取差集
let subtractingSet = setA.subtracting(setB) // {1, 2}

// 对称差集
let symmetricDiff = setA.symmetricDifference(setB) // {1, 2, 5, 6}

3. 检查关系 #

let setA: Set = [1, 2]
let setB: Set = [1, 2, 3, 4]

print(setA.isSubset(of: setB)) // true
print(setB.isSuperset(of: setA)) // true

let setC: Set = [5, 6]
print(setA.isDisjoint(with: setC)) // true

4. 遍历 #

let fruits: Set = ["Apple", "Banana", "Cherry"]

// 遍历集合
for fruit in fruits {
    print(fruit)
}

// 使用 forEach
fruits.forEach { print($0) }

5. 排序与随机化 #

let numbers: Set = [3, 1, 4, 2]
let sortedNumbers = numbers.sorted() // [1, 2, 3, 4](以数组形式返回)
let randomNumbers = numbers.shuffled() // [1, 3, 4, 2](随机顺序数组)

11. Set 的限制与注意事项 #

  1. 元素唯一性:

    • Set 中的元素必须是唯一的,如果添加重复值,Swift 会自动移除重复项。
  2. 无序性:

    • Set 没有顺序。元素的存储顺序可能与插入顺序不同,不能通过索引访问。
  3. 需要哈希值支持:

    • Set 的元素类型必须遵守 Hashable 协议(Swift 大多数基本类型默认符合 Hashable)。

总结 #

常用功能: #

  1. 集合关系: union, intersection, subtracting, isSubset(of:), isSuperset(of:)
  2. 操作与查询: insert, remove, contains, removeAll
  3. 数据处理与排序: sorted, shuffled, forEach

适用场景: #

  1. 需要存储唯一、不重复的数据,例如 ID 集合、用户名列表等。
  2. 数据无序,但需要高效查找是否包含某值。
  3. 需要集合运算(如并集、交集、差集)的场景。
本文共 1661 字,上次修改于 Jan 1, 2025