30天学会Swift-05:集合类型 - 集合 (Set)

学习目标

  • 理解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

实践练习

  1. 创建一个名为mySkillsSet<String>集合,并添加至少5个你的技能(例如:“Swift”, “iOS Development”, “Git”, “Problem Solving”, “Communication”)。
  2. 打印mySkills集合的元素数量,并检查它是否为空。
  3. 尝试向mySkills中插入一个已经存在的技能,观察结果。
  4. 创建一个名为newSkillsSet<String>集合,添加一些你希望学习的新技能。
  5. 执行以下集合操作并打印结果:
    • mySkillsnewSkills的并集。
    • mySkillsnewSkills的交集。
    • mySkills减去newSkills的差集。
    • mySkillsnewSkills的对称差集。
  6. 判断mySkills是否是newSkills的子集,并判断它们是否不相交。

思考题

  • 在什么情况下,你会选择使用Set而不是ArrayDictionary来存储数据?
  • 为什么集合中的元素必须是可哈希的?
  • unionintersection操作在实际应用中有什么例子?

学习资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明似水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值