Set 集合
Set 是指具有某种特质的具体的或抽象的对象汇总而成的集体。构成 Set 的这些对象称之为 Set 的元素。 Set 的三个特征:
- 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必须满足其一。
- 互斥性:一个集合中任何两个元素都是不相同的,即每个元素只能出现一次。
- 无序性:一个集合中每个元素的地位是一样的,元素之间是无序的。
Swift 的集合类型写作 Set, Element 是 Set 要存储的类型。不同于数组,集合没有等价的缩写。
创建
- 使用初始化语法器来创建一个确定类型的空的 Set
var letters = Set<Character>()
letters.insert("c")
print(letters)
// ["c"]
- 使用数组字面量创建 Set
var course: Set<String> = ["Math", "English", "History"]
course.insert("History") // 并不会执行插入操作,因为原 Set 已经有了 "History"
print(course)
// ["Math", "English", "History"]
为了能让类型存储在 Set 当中,它必须是可哈希的(就是说类型必须提供计算它自身哈希值的方法)。所有的 Swift 的基础类型(比如 String, Int, Double 和 Bool)默认都是可以哈希的,并且可以用于 Set 或者 Dictionary 的键。
Person 这个结构体没有遵循 Hashable 协议,导致不能存储在 Set 中。进行如下改造后就可以用 Set 存储 Person 结构体了。
struct Person {
var name: String
var age: Int
}
extension Person: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(age)
}
}
var person = Set<Person>()
person.insert(Person(name: "zs", age: 18))
print(person) // [MTSwift.Person(name: "zs", age: 18)]