demo鏈接:
https://share.weiyun.com/5VRfIYP
參考鏈接:
http://www.swift51.com/swift4.0/chapter2/04_Collection_Types.html#sets
集合(Set)用來存儲相同類型并且沒有確定順序的值党觅。當集合元素順序不重要時或者希望確保每個元素只出現(xiàn)一次時可以使用集合而不是數(shù)組脱柱。
注意:
Swift的Set
類型被橋接到Foundation
中的NSSet
類倒彰。
關(guān)于使用Foundation
和Cocoa
中Set
的知識,參見 Using Swift with Cocoa and Obejective-C(Swift 3.0.1) 中使用 Cocoa 數(shù)據(jù)類型部分蚯瞧。
創(chuàng)建一個空集合
你可以通過構(gòu)造器語法創(chuàng)建一個特定類型的空集合:
var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// 打印 "letters is of type Set<Character> with 0 items."
注意:通過構(gòu)造器,這里的letters變量的類型被推斷為Set<Character>
品擎。
此外埋合,如果上下文提供了類型信息,比如作為函數(shù)的參數(shù)或者已知類型的變量或常量萄传,我們可以通過一個空的數(shù)組字面量創(chuàng)建一個空的Set
:
letters.insert("a")
// letters 現(xiàn)在含有1個 Character 類型的值
letters = []
// letters 現(xiàn)在是一個空的 Set, 但是它依然是 Set<Character> 類型
用數(shù)組字面量創(chuàng)建集合
你可以使用數(shù)組字面量來構(gòu)造集合甚颂,并且可以使用簡化形式寫一個或者多個值作為集合元素:
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres 被構(gòu)造成含有三個初始值的集合
這個favoriteGenres
變量被聲明為一個String
值的集合,寫為Set<String>
秀菱。由于這個特定的集合含有指定String
類型的值振诬,所以它只允許存儲String
類型值。這里的favoriteGenres
變量有三個String
類型的初始值("Rock"衍菱,"Classical"和"Hip hop")贷揽,并以數(shù)組字面量的方式出現(xiàn)。
一個Set
類型不能從數(shù)組字面量中被單獨推斷出來梦碗,因此Set類型必須顯式聲明禽绪。然而,由于 Swift 的類型推斷功能洪规,如果你想使用一個數(shù)組字面量構(gòu)造一個Set并且該數(shù)組字面量中的所有元素類型相同印屁,那么你無須寫出Set的具體類型。favoriteGenres
的構(gòu)造形式可以采用簡化的方式代替:
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
由于數(shù)組字面量中的所有元素類型相同斩例,Swift 可以推斷出Set<String>
作為favoriteGenres
變量的正確類型雄人。
訪問和修改一個集合
為了找出一個Set
中元素的數(shù)量,可以使用其只讀屬性 count
:
print("I have \(favoriteGenres.count) favorite music genres.")
// I have 3 favorite music genres.
使用布爾屬性isEmpty
作為一個縮寫形式去檢查count
屬性是否為0:
if favoriteGenres.isEmpty {
print("As far as music goes, I'm not picky.")
} else {
print("I have particular music preferences.")
}
// I have particular music preferences.
可以通過調(diào)用Set
的insert(_:)
方法來添加一個新元素:
favoriteGenres.insert("Jazz")
// favoriteGenres 現(xiàn)在包含4個元素
可以通過調(diào)用Se
t的remove(_:)
方法去刪除一個元素念赶,如果該值是該Set
的一個元素則刪除該元素并且返回被刪除的元素值础钠,否則如果該Set
不包含該值,則返回nil叉谜。另外旗吁,Set
中的所有元素可以通過它的removeAll()
方法刪除。
if let removedGenre = favoriteGenres.remove("Rock") {
print("\(removedGenre)? I'm over it.")
} else {
print("I never much cared for that.")
}
//Rock? I'm over it.
使用contains(_:)
方法去檢查Set
中是否包含一個特定的值:
if favoriteGenres.contains("Funk") {
print("I get up on the good foot.")
} else {
print("It's too funky in here.")
}
//It's too funky in here.
遍歷一個集合
你可以在一個for-in
循環(huán)中遍歷一個Set
中的所有值停局。
for genre in favoriteGenres {
print("\(genre)")
}
// Classical
// Jazz
// Hip hop
更多關(guān)于for-in
循環(huán)的信息很钓,參見For 循環(huán)香府。
Swift 的Set
類型沒有確定的順序,為了按照特定順序來遍歷一個Set
中的值可以使用sorted()
方法码倦,它將返回一個有序數(shù)組企孩,這個數(shù)組的元素排列順序由操作符<
對元素進行比較的結(jié)果來確定。
for genre in favoriteGenres.sorted() {
print("\(genre)")
}
//Classical
//Hip hop
//Jazz
基本集合操作
下面的插圖描述了兩個集合-a和b-以及通過綠色區(qū)域顯示集合各種操作的結(jié)果袁稽。
https://share.weiyun.com/5AHBZ4j
-
intersection(_:)
根據(jù)兩個集合中都包含的值創(chuàng)建的一個新的集合 -
symmetricDifference(_:)
根據(jù)在一個集合中但不在兩個集合中的值創(chuàng)建一個新的集合 -
union(_:)
根據(jù)兩個集合的值創(chuàng)建一個新的集合 -
subtracting(_:)
根據(jù)不在該集合中的值創(chuàng)建一個新的集合
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits. intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits. symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
集合成員關(guān)系和相等
下面的插圖描述了三個集合a,b和c,以及通過重疊區(qū)域表述集合間共享的元素勿璃。集合a是集合b的父集合,因為a包含了b中所有的元素推汽,相反的蝗柔,集合b是集合a的子集合,因為屬于b的元素也被a包含民泵。集合b和集合c彼此不關(guān)聯(lián)癣丧,因為它們之間沒有共同的元素。
https://share.weiyun.com/5Grm1OD
-
==
運算符:
判斷兩個集合是否包含全部相同的值 -
isSubset(of:)
方法:
判斷一個集合中的值是否也被包含在另外一個集合中 -
isSuperset(of:)
方法:
判斷一個集合中包含另一個集合中所有的值 -
isStrictSubset(of:)
或者isStrictSuperset(of:)
方法:
判斷一個集合是否是另外一個集合的子集合或者父集合并且兩個集合并不相等 -
isDisjoint(with:)
方法:
判斷兩個集合是否不含有相同的值(是否沒有交集)
let houseAnimals: Set = ["??", "??"]
let farmAnimals: Set = ["??", "??", "??", "??", "??"]
let cityAnimals: Set = ["??", "??"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true