学习目标
- 理解Swift中集合(
Set)的基本概念和特点。 - 掌握集合的创建、初始化、插入和删除元素。
- 熟悉集合的遍历和常用方法。
- 学会执行基本的集合操作:并集、交集、差集和对称差集。
学习内容
1. 集合 (Set) 简介
集合是存储相同类型且无序的唯一值的容器。当元素的顺序不重要,且每个元素都必须是唯一的时候,可以使用集合而不是数组。
- 唯一性:集合中的所有元素都必须是唯一的,不允许重复。
- 无序性:集合中的元素没有特定的顺序。
- 可哈希性:集合中的元素类型必须是可哈希的(
Hashable协议)。Swift 的基本数据类型(如String,Int,Double,Bool)默认都是可哈希的。自定义类型如果需要存储在集合中,也必须遵循Hashable协议。
2. 集合的创建与初始化
- 空集合:
var favoriteGenres: Set<String> = [] // favoriteGenres 现在是一个空的 Set<String> 集合 // 或者使用类型推断 var anotherSet = Set<Int>() - 通过数组字面量创建集合:
var colors: Set<String> = ["Red", "Green", "Blue"] // colors 现在包含三个字符串值 // 注意:如果字面量中包含重复值,集合会自动去重 var numbers: Set<Int> = [1, 2, 3, 2, 1] print(numbers) // {1, 2, 3} (顺序可能不同)
3. 访问与修改集合
- 获取元素数量:
count属性。print("I have \(colors.count) favorite colors.") - 检查是否为空:
isEmpty属性。if colors.isEmpty { print("My colors set is empty.") } else { print("My colors set is not empty.") } - 插入元素:
insert(_:)方法。如果元素已存在,则不执行任何操作。colors.insert("Yellow") // colors 现在包含 "Red", "Green", "Blue", "Yellow" let (inserted, memberAfterInsert) = colors.insert("Red") print("Inserted: \(inserted), Member after insert: \(memberAfterInsert)") // Inserted: false, Member after insert: Red (因为"Red"已存在) - 移除元素:
remove(_:)方法。如果元素存在并被移除,则返回被移除的元素;否则返回nil。if let removedColor = colors.remove("Green") { print("\(removedColor) was removed.") } else { print("Green was not found.") } // colors 现在包含 "Red", "Blue", "Yellow" colors.removeAll() // colors 现在是空集合 - 检查是否包含元素:
contains(_:)方法。if colors.contains("Blue") { print("Blue is one of my colors.") }
4. 遍历集合
- 使用
for-in循环:for color in colors { print(color) } // 如果需要按特定顺序遍历,可以先排序 for color in colors.sorted() { print(color) }
5. 集合操作
Swift提供了方便的方法来执行集合的数学运算。
intersection(_:):创建两个集合的交集(共同的元素)。let oddDigits: Set = [1, 3, 5, 7, 9] let evenDigits: Set = [0, 2, 4, 6, 8] let singleDigitPrimeNumbers: Set = [2, 3, 5, 7] print(oddDigits.intersection(evenDigits).sorted()) // [] print(oddDigits.intersection(singleDigitPrimeNumbers).sorted()) // [3, 5, 7]symmetricDifference(_:):创建两个集合的对称差集(只在一个集合中出现的元素)。print(oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()) // [1, 2, 9]union(_:):创建两个集合的并集(所有不重复的元素)。print(oddDigits.union(evenDigits).sorted()) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]subtracting(_:):创建从一个集合中减去另一个集合的元素(差集)。print(oddDigits.subtracting(singleDigitPrimeNumbers).sorted()) // [1, 9]
6. 集合关系
isSubset(of:):判断一个集合是否是另一个集合的子集。isSuperset(of:):判断一个集合是否是另一个集合的超集。isStrictSubset(of:)/isStrictSuperset(of:):判断一个集合是否是另一个集合的严格子集/超集(不相等)。isDisjoint(with:):判断两个集合是否没有共同的元素(不相交)。
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
print(houseAnimals.isSubset(of: farmAnimals)) // true
print(farmAnimals.isSuperset(of: houseAnimals)) // true
print(farmAnimals.isDisjoint(with: cityAnimals)) // true
实践练习
- 创建一个名为
mySkills的Set<String>集合,并添加至少5个你的技能(例如:“Swift”, “iOS Development”, “Git”, “Problem Solving”, “Communication”)。 - 打印
mySkills集合的元素数量,并检查它是否为空。 - 尝试向
mySkills中插入一个已经存在的技能,观察结果。 - 创建一个名为
newSkills的Set<String>集合,添加一些你希望学习的新技能。 - 执行以下集合操作并打印结果:
mySkills和newSkills的并集。mySkills和newSkills的交集。mySkills减去newSkills的差集。mySkills和newSkills的对称差集。
- 判断
mySkills是否是newSkills的子集,并判断它们是否不相交。
思考题
- 在什么情况下,你会选择使用
Set而不是Array或Dictionary来存储数据? - 为什么集合中的元素必须是可哈希的?
union和intersection操作在实际应用中有什么例子?
1399

被折叠的 条评论
为什么被折叠?



