1. Set的概念
Set是指具有某种特定性质的具体的或抽象的对象汇总而成的集体.其中,构成Set的这些对象则称为该Set的元素.
2.Set集合的三个特性
2.1.确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一;
2.2.互斥性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次;
2.3.无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的.
3.创建Set
Swift的集合类型写做Set,这里的Element是Set要储存的类型.不同与数组,集合没有等价的简写.
使用初始化器语法来创建一个确定类型的空Set;
使用数组字面量创建Set
var letters = Set<Character>()
letters.insert("c")
print(letters)
var course: Set<String> = ["Match","English","History"]
course.insert("History")
print(course)
4.Set类型的哈希值
1.为了能让类型存储在Set当中,他必须是可哈希的–就是说类型必须提供计算他自身哈希值的方法;
2.所有Swift的基础类型(比如String,int,Double和Bool)默认都是可哈希的,并且可以用于Set或者Dictionary的键.
//错误的方式
struct Person{
var name:String
var age:Int
}
var personSet = Set<Person>()//Type 'Person' does not conform to protocol 'Hashable'
personSet.insert(Person(name: "zhangSan", age: 18))
//正确的方式
struct Person{
var name:String
var age:Int
}
extension Person:Hashable
{
func hash(into hasher:inout Hasher) {
hasher.combine(name)
hasher.combine(age)
}
}
var personSet = Set<Person>()
personSet.insert(Person(name: "zhangSan", age: 18))
5.遍历Set
可以使用For-in遍历Set
因为Set是无序的,如果要顺序遍历Set,使用sorted()方法
var courses: Set = ["Match","English","History"]
//没有顺序的遍历
for course in courses {
print(course)
}
//一定顺序的遍历
for course in courses.sorted() {
print(course)
}
6.添加元素
insert(_:)添加一个元素到Set;
update(with:)如果已经有相等的元素,替换为新元素.如果Set中没有,则插入.
7.移除元素
filter(:)返回一个新的Set,新Set的元素是原始Set符合条件的元素.
remove(:)从Set当中移除一个元素,如果元素是Set的成员就移除它,并且返回移除的值,如果合集没有这个成员就返回nii.
removeAll()移除所有的元素.
removeFirst()移除Set的第一个元素,因为Set是无序的,所以第一个元素并不是放入的第一个元素.
8.基本Set操作的定义
1.intersection(:)交集,由属于A且属于B的相同元素组成的集合,记作A∩B(或B∩A);
2.union(:)并集,由所有属于集合A或者属于集合B的元素所组成的集合,记作A∪B(或B∪A);
3.symmetricDifference(:)对称差集,集合A与集合B的对称差集定义为集合A与集合B中所有不属于A∩B的元素的集合;
4.subtract(:)相对补集,由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作A-B或A\B.
let set: Set<Character> = ["A","B","C"];
let set2: Set<Character> = ["B","E","F","G"]
print(set.intersection(set2))//["B"]
print(set.union(set2))//["A", "C", "B", "G", "F", "E"]
print(set.symmetricDifference(set2))//["A", "C", "G", "F", "E"]
print(set.subtracting(set2))//["C", "A"]
isSubset(of: ) 判断是否是另一个Set或者Sequence的子集
isSuperset(of: ) 判断是否是另一个Set或者Sequence的超集
isStrictSubset(of: )和isStrictSuperset(of: ) 判断是否是另一个Set的子集或者超集,但是又不等于另一个Set.
isDisjoint(with: ) 判断两个Set是否有公共元素,如果没有返回true,如果有返回false.