用來存儲相同類型翼抠,沒有確定順序的值。與數(shù)組的區(qū)別在于兩點——無序获讳,不可重復(fù)阴颖。在數(shù)學(xué)上,我們稱Set為集合丐膝,而它的特性也符合數(shù)學(xué)上集合的特性量愧,但是在Swift中,數(shù)組和字典也是集合類型帅矗,Set只是集合類型的一種偎肃,所以我還是說“Set”而不是“集合”。
(1)創(chuàng)建Set
創(chuàng)建Set主要有兩種方式损晤,通過Set的構(gòu)造函數(shù)創(chuàng)建软棺,和用字面量的形式創(chuàng)建,下面的代碼演示了創(chuàng)建Set的方法:
var set1 = Set<String>() // 通過構(gòu)造函數(shù)創(chuàng)建了一個空的Set尤勋,而且只能存儲String類型的數(shù)據(jù)
var set2:Set<String> = ["紅色", "綠色", "藍色", "紫色"] // 通過字面量的形式創(chuàng)建了一個Set喘落,也明確指出其存儲的數(shù)據(jù)只能是String類型的數(shù)據(jù)
var set3:Set = ["紅色", "綠色", "藍色"] // 通過字面量的形式創(chuàng)建了一個Set,通過字面量的推斷最冰,可以推斷出set3只能存儲String類型的數(shù)據(jù)
在上面的截圖中可以看出Set中的元素是無序的瘦棋。
(2)訪問和修改Set
獲取Set中元素的數(shù)量
var set3:Set = ["紅色", "綠色", "藍色"]
let count = set3.count // 獲取元素個數(shù)
Set的增刪 查詢 操作
var colors:Set = ["red", "green", "blue" , "white"]
// 添加元素
colors.insert("yellow")
// 刪除元素
colors.remove("green")
// 檢查是否包含某個元素
let isContainBlue = colors.contains("blue")
// 刪除所有元素
colors.removeAll()
(3)遍歷Set
用for-in方法來遍歷Set。 我們知道Set中的元素是無序的暖哨,所以在遍歷Set時順序也就不一定赌朋,Swift為我們考慮到了這個問題,提供了sort()方法,讓我們可以先將Set排序沛慢,再進行遍歷
for color in colors { // 遍歷無序的Set
print(color)
}
for color in colors.sort() { // 遍歷有序的Set
print(color)
}
(4)Set之間的關(guān)系
Set相當(dāng)于數(shù)學(xué)中的集合赡若,Set的關(guān)系也和數(shù)學(xué)中的集合之間的關(guān)系差不多。
上圖的a,b,c分別表示一個Set团甲,a包含b逾冬,所以a是b的父Set,b是a的子Set躺苦,b和c沒有相同的元素身腻,所以沒有關(guān)聯(lián)。還有一種關(guān)系不容易用圖表示匹厘,如果兩個Set所有的元素都一樣嘀趟,則兩個Set想等。
下面用代碼來判斷兩個Set之間的關(guān)系:
let a:Set<Int> = [1,2,3,4]
let b:Set<Int> = [1,2]
let c:Set<Int> = [5,6,7,8]
let d:Set<Int> = [1,2]
print("b是a的子集", b.isSubsetOf(a))
print("a是b的父集", a.isSupersetOf(b))
print("b和c沒有交集", b.isDisjointWith(c))
print("b和d相等", b == d)
(5)Set之間的操作
根據(jù)Set之間的關(guān)系愈诚,我們可以對Set進行一些操作她按,比如求交集,求并集等等:
var a:Set<Int> = [1,2,3,4,5]
var b:Set<Int> = [4,5,6,7,8]
print(a.intersection(b).sorted()) // 交集 [4,5]
print(a.symmetricDifference(b).sorted()) // 除了交集之外的元素 [1,2,3,6,7,8]
print(a.union(b).sorted()) // 并集 [1,2,3,4,5,6,7,8]
print(a.substracting(b).sorted()) // a包含但是b不包含的元素 [1,2,3]