上一章Swift教程请查看:swift数组的使用和操作
在本教程中,你将了解集合、创建集合、修改集合以及集合中的一些常见操作。
在前一篇Swift数组的文章中,我们了解了如何创建可以在一个有序列表中保存多个值的数组。
但是,如果我们必须确保一个列表只能保存一个值,我们使用Swift中的一个集合。
什么是集合?
集合set只是一个容器,它可以在一个无序列表中保存多个数据类型的值,并确保容器中唯一的元素(也就是每个数据只出现一次)。
无序列表意味着你无法按照定义集合中的项的顺序获取元素。
与使用数组相比,使用集合的主要优点是当你需要确保一个项只出现一次,并且项的顺序不重要时。
存储在集合中的值必须是可哈希/散列的,这意味着它必须提供hashValue属性。这很重要,因为集合是无序的,它使用hashValue来访问集合的元素。
所有Swift的基本类型(如String、Int、Double和Bool)在默认情况下都是可散列的,可以用作设置值类型。然而,你也可以在Swift中创建你的可散列类型,并将其存储在一个集合中。
如何在Swift中声明一个集合?
通过将类型指定为set,然后指定它可以存储在< >中的数据类型,你可以创建一个空集。
例1:声明一个空集合
let emptyIntSet:Set = []
print(emptyIntSet)
OR
let emptyIntSet:Set = Set()
print(emptyIntSet)
在上面的程序中,我们声明了一个类型为Set的常量emptyIntSet,它可以存储多个整型值并使用0值初始化。
由于Swift是一种类型推断语言,你也可以直接创建set,不需要指定数据类型,但必须用一些值初始化,这样编译器才能推断出它的类型:
例2:用一些值声明一个集合
let someIntSet:Set = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(someIntSet)
在上面的程序中,我们声明了一个常量someIntSet,它可以存储整数集,而不需要显式地指定类型。然而,当定义变量时我们需要写:Set,否则Swift将为我们创建一个数组。
同样,作为数组,我们使用[]方括号将集合初始化为1、2、3、4、5、6、7、8、9个值。
正如你所了解的,当你尝试将集合内的值打印为print(someIntSet)时,你将以与你在集合中定义的项不同的顺序获得结果,因为它存储的值没有定义的顺序。因此,每次访问订单时都会发生变化。
例3:声明一个具有重复值的集合
let someStrSet:Set = ["ab","bc","cd","de","ab"]
print(someStrSet)
在上面的程序中,我们在集合中定义了一个重复的值ab。当我们试图使用print(someStrSet)访问集合中的值时,重复的值会自动从集合中删除。
你也可以声明一套你自己的自定义的类型。
如何访问Swift中的集合元素?
不能使用下标语法作为数组访问集合的元素,这是因为集合是无序的,并且没有访问元素的索引。
因此,你需要使用set的方法和属性或使用for-in循环来访问它。
例4:访问集合的元素
var someStrSet:Set = ["ab", "bc", "cd", "de"]
for val in someStrSet {
print(val)
}
在上面的程序中,我们以与集合元素不同的顺序获得val,因为集合是无序的,不像数组。
你也可以直接访问一个集合的元素,删除集合中的值,如下所示:
示例5:使用remove()访问集合元素
var someStrSet:Set = ["ab", "bc", "cd", "de"]
let someVal = someStrSet.remove("cd")
print(someVal)
print(someStrSet)
在上面的程序中,可以看到remove方法返回一个可选字符串。因此,建议你按照以下方式进行可选处理:
示例6:可选的remove()处理
var someStrSet:Set = ["ab", "bc", "cd", "de"]
if let someVal = someStrSet.remove("cd") {
print(someVal)
print(someStrSet)
} else {
print("cannot find")
}
如何在集合中添加新元素?
可以使用Swift中的insert()方法向集合添加新元素。
示例7:使用insert()添加新元素
var someStrSet:Set = ["ab", "bc", "cd", "de"]
someStrSet.insert("ef")
print(someStrSet)
在上面的程序中,我们使用set的insert()方法向set添加一个新元素。因为set是无序的,所以插入元素的位置是未知的。
集合操作
使用集合的另一个主要优点是可以执行集合操作,例如将两个集合组合在一起,确定两个集合有哪些共同的值等等,种运算类似于数学中的集合运算。
合集
两个集合a和b的并集是在a中,或b中,或同时在a和b中元素的集合。
let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 2, 4, 6, 8]
print(a.union(b))
交集
两个集合a和b的交集是包含a的所有元素的集合,这些元素也属于b。
let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.intersection(b))
因此,print(a.intersection(b))输出一个新集合,其值[7,3]在a和b中都是公共的。
差集
两个集合a和b的相减是一个集合,这个集合包含了a的所有元素,但是去掉了也属于b的元素。
let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.subtracting(b))
因此,print(a. subtracting (b))输出一个值为[5,9,1]的新集合。
对称差分
两个集合a和b的对称差是一个集合中包含了两个集合中的任何一个而不是两个集合中的所有元素。
let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
print(a.symmetricDifference(b))
因此,print(a.
symmetricdifference (b))输出一个值为[5,6,8,0,1,9]的新集合。
集合成员和相等操作
集合相等
可以使用==操作符检查两个集合是否包含相同的元素。如果两个集合包含相同的元素,则返回true,否则返回false。
例5:集合相等操作
let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 7, 6, 8]
let c:Set = [9, 7, 3, 1, 5]
if a == b {
print("a and b are same")
} else {
print("a and b are different")
}
if a == c {
print("a and c are same")
} else {
print("a and c are different")
}
集合成员操作
你也可以使用以下方法来检查两个集合之间的关系:
- isSubset(of:) 这个方法确定一个集合的所有值是否包含在指定的集合中。
- isSuperset(of:) 此方法确定一个集合是否包含指定集合中的所有值
- isStrictSubset(of:)或isStrictSuperset(of:):这个方法确定一个集合是子集还是超集,但不等于指定的集合。
- isDisjoint(with:) 这个方法确定两个集合是否没有共同的值。
例6:集合成员操作
let a: Set = [1, 3, 5, 7, 9]
let b: Set = [0, 3, 1, 7, 6, 8, 9, 5]
print("isSubset:", a.isSubset(of: b))
print("isSuperset:", b.isSuperset(of: a))
print("isStrictSubset:", a.isStrictSubset(of: b))
print("isDisjointWith:", a.isDisjoint(with: b))
让我们来分析一下print语句中使用的方法:
- isSubset返回为真是因为集合b包含了a中的所有元素
- isSuperset返回真,因为b包含了a的所有值。
- isStrictSubset返回为真,因为集合b包含了a中的所有元素,且两个集合不相等。
- isDisjointWith返回为false,因为a和b有一些相同的值。
一些有用的集合内置函数和属性
isEmpty
此属性确定集合是否为空。如果集合不包含任何值,则返回true,否则返回false。
例7:isEmpty是如何使用的?
let intSet:Set = [21, 34, 54, 12]
print(intSet.isEmpty)
first
此属性用于访问集合的第一个元素。
例8:first如何使用?
let intSet = [21, 34, 54, 12]
print(intSet.first)
因为set是一个无序集合,所以第一个属性不能保证集合的第一个元素。
类似地,可以使用last属性访问集合的最后一个元素。
Insert
插入函数用于在集合中插入/追加元素。
例9:insert如何使用?
var intSet:Set = [21, 34, 54, 12]
intSet.insert(50)
print(intSet)
reversed
这个函数以相反的顺序返回集合中的元素。
例10:reverse()如何使用?
var intSet:Set = [21, 22, 23, 24, 25]
print(intSet)
let reversedSet = intSet.reversed()
print(reversedSet)
count
此属性返回集合中元素的总数。
例11:count是如何使用?
let floatSet:Set = [10.2, 21.3, 32.0, 41.3]
print(floatSet.count)
removeFirst
这个函数从集合中删除并返回第一个值。
例12:removeFirst如何使用?
var strSet:Set = ["ab", "bc", "cd", "de"]
let removedVal = strSet.removeFirst()
print("删除的值为 \(removedVal)")
print(strSet)
类似地,你也可以使用removeAll函数来清空一个集合。