在 Swift 中,Set
是一个无序的集合类型,用来存储唯一、不可重复的值。与数组 (Array) 不同,Set 的元素没有固定顺序,同时保证每个元素的值是唯一的,且其操作效率非常高(基于哈希表)。
以下是 Swift Set 集合 的常用接口和功能介绍,按功能分类。
1. Set 的基本属性与信息
#
属性或方法 | 功能说明 | 示例 |
---|
count | 返回集合中元素的数量。 | print(set.count) |
isEmpty | 检查集合是否为空,返回 true 或 false 。 | if set.isEmpty { print("Empty Set") } |
contains(_:) | 检查集合是否包含指定的值,返回 true 或 false 。 | if 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(_:) | 删除指定的元素。如果元素不存在,则返回 nil 。 | let 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:) | 检查当前集合是否是指定集合的子集,返回 true 或 false 。 | if set.isSubset(of: otherSet) { ... } |
isSuperset(of:) | 检查当前集合是否是指定集合的超集,返回 true 或 false 。 | if set.isSuperset(of: otherSet) { ... } |
isDisjoint(with:) | 检查两个集合是否无交集,返回 true 或 false 。 | if set.isDisjoint(with: otherSet) { ... } |
contains(_:) | 检查集合中是否包含指定元素,返回 true 或 false 。 | if 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 的限制与注意事项
#
元素唯一性:
Set
中的元素必须是唯一的,如果添加重复值,Swift 会自动移除重复项。
无序性:
Set
没有顺序。元素的存储顺序可能与插入顺序不同,不能通过索引访问。
需要哈希值支持:
Set
的元素类型必须遵守 Hashable
协议(Swift 大多数基本类型默认符合 Hashable
)。
总结
#
常用功能:
#
- 集合关系:
union
, intersection
, subtracting
, isSubset(of:)
, isSuperset(of:)
。 - 操作与查询:
insert
, remove
, contains
, removeAll
。 - 数据处理与排序:
sorted
, shuffled
, forEach
。
适用场景:
#
- 需要存储唯一、不重复的数据,例如 ID 集合、用户名列表等。
- 数据无序,但需要高效查找是否包含某值。
- 需要集合运算(如并集、交集、差集)的场景。