集合(Set)用來存儲相同類型并且沒有確定順序的值。當集合元素順序不重要時或者希望確保每個元素只出現一次時可以使用集合而不是數組汞扎。
集合類型語法
Swift 中的Set類型被寫為Set<Element>,這里的Element表示Set中允許存儲的類型擅这,和數組不同的是澈魄,集合沒有等價的簡化形式。
創(chuàng)建和構造一個空的集合
你可以通過構造器語法創(chuàng)建一個特定類型的空集合:
var letters = Set<Character>()
此外仲翎,如果上下文提供了類型信息痹扇,比如作為函數的參數或者已知類型的變量或常量,我們可以通過一個空的數組字面量創(chuàng)建一個空的Set:
letters.insert("a")
// letters 現在含有1個 Character 類型的值
letters = []
// letters 現在是一個空的 Set, 但是它依然是 Set<Character>類型
由于 Swift 的類型推斷功能谭确,如果你想使用一個數組字面量構造一個Set并且該數組字面量中的所有元素類型相同帘营,那么你無須寫出Set的具體類型。
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
由于數組字面量中的所有元素類型相同逐哈,Swift 可以推斷出Set作為favoriteGenres變量的正確類型芬迄。
遍歷
Swift 的Set類型沒有確定的順序,為了按照特定順序來遍歷一個Set中的值可以使用sorted()方法昂秃,它將返回一個有序數組禀梳,這個數組的元素排列順序由操作符'<'對元素進行比較的結果來確定.
for genre in favoriteGenres.sorted() {
print("\(genre)")
}
// prints "Classical"
// prints "Hip hop"
// prints "Jazz
集合操作
你可以高效地完成Set的一些基本操作,比如把兩個集合組合到一起肠骆,判斷兩個集合共有元素算途,或者判斷兩個集合是否全包含,部分包含或者不相交蚀腿。
基本集合操作
下面的插圖描述了兩個集合-a和b-以及通過陰影部分的區(qū)域顯示集合各種操作的結果嘴瓤。
●使用intersection(_:)方法根據兩個集合中都包含的值創(chuàng)建的一個新的集合。
●使用symmetricDifference(_:)方法根據在一個集合中但不在兩個集合中的值創(chuàng)建一個新的集合莉钙。
●使用union(_:)方法根據兩個集合的值創(chuàng)建一個新的集合廓脆。
●使用subtracting(_:)方法根據不在該集合中的值創(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]
集合成員關系和相等
下面的插圖描述了三個集合-a,b和c,以及通過重疊區(qū)域表述集合間共享的元素磁玉。集合a是集合b的父集合停忿,因為a包含了b中所有的元素,相反的蚊伞,集合b是集合a的子集合席赂,因為屬于b的元素也被a包含。集合b和集合c彼此不關聯时迫,因為它們之間沒有共同的元素颅停。
●使用“是否相等”運算符(==)來判斷兩個集合是否包含全部相同的值。
●使用isSubset(of:)方法來判斷一個集合中的值是否也被包含在另外一個集合中掠拳。
●使用isSuperset(of:)方法來判斷一個集合中包含另一個集合中所有的值癞揉。
●使用isStrictSubset(of:)或者isStrictSuperset(of:)方法來判斷一個集合是否是另外一個集合的子集合或者父集合并且兩個集合并不相等。
●使用isDisjoint(with:)方法來判斷兩個集合是否不含有相同的值(是否沒有交集)。