1.1 Set 的概念
Set 是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成 Set 的这些对象则称为该 Set 的元素。
1.2 Set 的三个特性
确定性 :给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一。
互斥性 : 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
无序性 : 一个集合中,每个元素的地位都是相同的,元素之间是无序的。
1.3 Set 的创建
使用初始化器语法来创建一个确定类型的空 Set。
使用数组字面量创建 Set。
var student = Set<String>() student.insert("zhangsan")print(student)/** 输出结果如下: ["zhangsan"] */
1.4 Set 的类型的哈希值
为了能让类型储存在 Set 当中,它必须是可哈希的——就是说类型必须提供计算它自身哈希值的方法。
所有 Swift 的基础类型(比如 String, Int, Double, 和 Bool)默认都是可哈希的,并且可以用于 Set 或者 Dictionary 的键。
1.5 Set的自定义类型需要实现 Hashable 协议
struct Student{ var name:String var age: Int}extension Student:Hashable{ func hash(into hasher: inout Hasher) { hasher.combine(name) } }extension Student: Equatable{ static func == (lhs: Student,rhs:Student) -> Bool{ return lhs.name == rhs.name } }
2 Set的访问和修改
2.1 Set的遍历
可以使用 For-In 遍历 Set。
因为 Set 是无序的,如果要顺序遍历 Set,使用 sorted()方法。
//遍历let students: Set = ["zhangsan","lisi","wangwu"]for student in students { print(student) }print("----------------分割线------------------")for student in students.sorted(){ print(student) }/** 输出结果如下: zhangsan wangwu lisi ----------------分割线------------------ lisi wangwu zhangsan */
2.2
使用 count 获取 Set 里元素个数。
使用 isEmpty 判断 Set 是否为空。
//访问let student: Set<String> = ["zhagnsan","lisi","wangwu"]print(student.count)print(student.isEmpty)/** 输出结果如下: 3 false */
2.3 Set 的添加元素
insert(_:) 添加一个元素到 Set。
update(with:) 如果已经有相等的元素,替换为新元素。如果 Set 中没有,则插入。
var studentSet: Set = [Student(name: "zhangsan", age: 15),Student(name: "lisi", age: 16)] studentSet.insert(Student(name: "wangwu", age: 17))print(studentSet) studentSet.update(with: Student(name: "zhangsan", age: 25))print(studentSet) studentSet.update(with: Student(name: "niuliu", age: 19))print(studentSet)/** 输出结果如下: [Student(name: "wangwu", age: 17), Student(name: "zhangsan", age: 15), Student(name: "lisi", age: 16)] [Student(name: "wangwu", age: 17), Student(name: "zhangsan", age: 25), Student(name: "lisi", age: 16)] [Student(name: "zhangsan", age: 25), Student(name: "wangwu", age: 17), Student(name: "lisi", age: 16), Student(name: "niuliu", age: 19)] */
2.4 Set的
fifilter(_:) 返回一个新的 Set,新 Set 的元素是原始 Set 符合条件的元素。
remove(_:) 从 Set 当中移除一个元素,如果元素是 Set 的成员就移除它,并且返回移除的
值,如果合集没有这个成员就返回 nil 。
removeAll() 移除所有元素。
removeFirst() 移除 Set 的第一个元素,因为 Set 是无序的,所以第一个元素并不是放入的
第一个元素。
var studentSet: Set = [Student(name: "zhangsan", age: 15),Student(name: "lisi", age: 16),Student(name: "wangwu", age: 17)]print(studentSet) studentSet.remove(Student(name: "lisi",age: 80))print(studentSet) studentSet.removeFirst()print(studentSet) studentSet.removeAll()print(studentSet)/** 输出结果如下: [Student(name: "wangwu", age: 17), Student(name: "zhangsan", age: 15), Student(name: "lisi", age: 16)] [Student(name: "zhangsan", age: 25), Student(name: "wangwu", age: 17), Student(name: "niuliu", age: 19)] [Student(name: "wangwu", age: 17), Student(name: "niuliu", age: 19)] [] */
3 Set 的操作
3.1Set 操作的定义
intersection(_:) 交集,由属于A且属于B的相同元素组成的集合,记作A∩B(或B∩A)。
union(_:) 并集,由所有属于集合A或属于集合B的元素所组成的集合,记作A∪B(或B∪A)。
symmetricDifffference(_:) 对称差集,集合A与集合B的对称差集定义为集合A与集合B中所有不属
于A∩B的元素的集合。
subtracting(_:) 相对补集,由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记
作A-B或A\B。
3.2 Set 的基本操作
let setA: Set<Character> = ["a","b","C"]let setB: Set<Character> = ["a","d","e"]print(setA.intersection(setB))//交集print(setA.union(setB))//并集print(setA.symmetricDifference(setB))//补集print(setA.subtracting(setB))//差集/** 输出结果如下: ["a"] ["d", "b", "C", "a", "e"] ["d", "b", "C", "e"] ["C", "b"] */
3.3
isSubset(of:) 判断是否是另一个 Set 或者 Sequence 的子集。
isSuperset(of:) 判断是否是另一个 Set 或者 Sequence 的超集。
isStrictSubset(of:) 和 isStrictSuperset(of:) 判断是否是另一个 Set 的子集或者超集,但是
又不等于另一个 Set 。
isDisjoint(with:) 判断两个 Set 是否有公共元素,如果没有返回 true,如果有返回 false
let smallSet:Set = [1,2,3]let bigSet: Set = [1,2,3,4,5]print(smallSet.isSubset(of: bigSet))print(bigSet.isSuperset(of: smallSet))print(smallSet.isStrictSubset(of: bigSet))print(bigSet.isStrictSuperset(of: smallSet))print(smallSet.isDisjoint(with: bigSet))/** 输出结果如下: true true true true false */