demo鏈接:
https://share.weiyun.com/5VRfIYP
參考鏈接:
http://www.swift51.com/swift4.0/chapter2/04_Collection_Types.html#sets
集合(Set)用來存儲相同類型并且沒有確定順序的值。當集合元素順序不重要時或者希望確保每個元素只出現一次時可以使用集合而不是數組。
注意:
Swift的Set
類型被橋接到Foundation
中的NSSet
類。
關于使用Foundation
和Cocoa
中Set
的知識,參見 Using Swift with Cocoa and Obejective-C(Swift 3.0.1) 中使用 Cocoa 數據類型部分。
創建一個空集合
你可以通過構造器語法創建一個特定類型的空集合:
var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// 打印 "letters is of type Set<Character> with 0 items."
注意:通過構造器,這里的letters變量的類型被推斷為Set<Character>
。
此外,如果上下文提供了類型信息,比如作為函數的參數或者已知類型的變量或常量,我們可以通過一個空的數組字面量創建一個空的Set
:
letters.insert("a")
// letters 現在含有1個 Character 類型的值
letters = []
// letters 現在是一個空的 Set, 但是它依然是 Set<Character> 類型
用數組字面量創建集合
你可以使用數組字面量來構造集合,并且可以使用簡化形式寫一個或者多個值作為集合元素:
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres 被構造成含有三個初始值的集合
這個favoriteGenres
變量被聲明為一個String
值的集合,寫為Set<String>
。由于這個特定的集合含有指定String
類型的值,所以它只允許存儲String
類型值。這里的favoriteGenres
變量有三個String
類型的初始值("Rock","Classical"和"Hip hop"),并以數組字面量的方式出現。
一個Set
類型不能從數組字面量中被單獨推斷出來,因此Set類型必須顯式聲明。然而,由于 Swift 的類型推斷功能,如果你想使用一個數組字面量構造一個Set并且該數組字面量中的所有元素類型相同,那么你無須寫出Set的具體類型。favoriteGenres
的構造形式可以采用簡化的方式代替:
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
由于數組字面量中的所有元素類型相同,Swift 可以推斷出Set<String>
作為favoriteGenres
變量的正確類型。
訪問和修改一個集合
為了找出一個Set
中元素的數量,可以使用其只讀屬性 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.
可以通過調用Set
的insert(_:)
方法來添加一個新元素:
favoriteGenres.insert("Jazz")
// favoriteGenres 現在包含4個元素
可以通過調用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
循環中遍歷一個Set
中的所有值。
for genre in favoriteGenres {
print("\(genre)")
}
// Classical
// Jazz
// Hip hop
更多關于for-in
循環的信息,參見For 循環。
Swift 的Set
類型沒有確定的順序,為了按照特定順序來遍歷一個Set
中的值可以使用sorted()
方法,它將返回一個有序數組,這個數組的元素排列順序由操作符<
對元素進行比較的結果來確定。
for genre in favoriteGenres.sorted() {
print("\(genre)")
}
//Classical
//Hip hop
//Jazz
基本集合操作
下面的插圖描述了兩個集合-a和b-以及通過綠色區域顯示集合各種操作的結果。
https://share.weiyun.com/5AHBZ4j
-
intersection(_:)
根據兩個集合中都包含的值創建的一個新的集合 -
symmetricDifference(_:)
根據在一個集合中但不在兩個集合中的值創建一個新的集合 -
union(_:)
根據兩個集合的值創建一個新的集合 -
subtracting(_:)
根據不在該集合中的值創建一個新的集合
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,以及通過重疊區域表述集合間共享的元素。集合a是集合b的父集合,因為a包含了b中所有的元素,相反的,集合b是集合a的子集合,因為屬于b的元素也被a包含。集合b和集合c彼此不關聯,因為它們之間沒有共同的元素。
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