做者:Thomas Hanning,原文連接,原文日期:2018-09-06git
集合(Set)是 Swift 集合類型(collection types)之一,集合用來存儲類型相同且沒有肯定順序惟一的值。你能夠將集合想象成一盒檯球:它們在顏色和數量上獨一無二,但在盒內是無序的。swift
提示:這篇文章使用的是 Swift 4 和 Xcode 10數組
建立一個集合很是簡單:ui
let setA: Set<String> = ["a","b","c"]
複製代碼
在這個例子中,建立一個 String
類型的集合,命名爲 setA
。它存儲着 a
、b
、c
三個值。與數組相比,集合內元素是無序的。經過編譯器的類型推導功能,你也能夠像以下方式建立集合:spa
let setB: Set = ["a","b","c"]
複製代碼
一樣也可使用集合的構造器:翻譯
let setC = Set(["a","b","c"])
複製代碼
跟數組同樣,若是使用 let
來定義一個集合,它就是不可變的。使用 var
定義的是一個可變集合。code
var setD = Set(["a","b"])
複製代碼
稍後咱們將瞭解更多有關可變集合的信息。cdn
你可使用循環來訪問集合中的元素:blog
for value in setA {
print(value)
}
複製代碼
注意:每次運行代碼時,循環中值的順序可能不一樣。從表面來看,它們像是隨機返回同樣。
首先,你能夠檢查集合是否爲空:
print(setA.isEmpty)
複製代碼
也能夠獲取集合中元素的個數:
print(setA.count)
複製代碼
上面的操做對數組一樣有效,對集合而言,更加廣泛的問題是判斷集合中是否包含某個元素。爲此,你可使用 contains
方法:
print(setA.contains("a"))
複製代碼
你能夠向可變集合裏面添加和刪除元素:
setD.insert("c")
setD.remove("a")
複製代碼
因爲集合元素的惟一性,所以只能將同一個元素添加到集合中一次。能夠屢次使用相同的值調用 insert
方法,但集合不會改變。
var setE: Set = [1,2,3,4]
setE.insert(5)
setE.insert(5)
setE.insert(5)
print(setE) //[4,5,1,2,3]
複製代碼
和前面所說的同樣,上面代碼每次執行時輸出的順序可能不一樣,由於集合元素無序。
集合間能進行比較。顯然,能夠比較兩個集合是否相等:
let setA: = [「a」, 「b」, 「c」]
let setB: = [「a」, 「b」, 「c」]
if setA == setB {
print(「the sets are equal」)
}
複製代碼
這種狀況下,集合是相等的。
比較兩個集合的大小是沒有明確的定義,但能夠檢查一個集合是不是另外一個集合的子集:
let intSetA: Set = [1,2,3,4,5,6,7,8,9,0]
let intSetB: Set = [1,2,3]
intSetB.isSubset(of: intSetA) //true
複製代碼
也能夠檢查集合是不是另外一個集合的真子集。這種狀況就是該集合是另外一個集合的子集但不想等。
let intSetA: Set = [1,2,3,4,5,6,7,8,9,0]
let intSetB: Set = [1,2,3,4,5,6,7,8,9,0]
let intSetC: Set = [3,4,5]
intSetB.isSubset(of: intSetA) //true
intSetB.isStrictSubset(of: intSetA) //false
intSetC.isSubset(of: intSetA) // true
intSetC.isStrictSubset(of: intSetA) //true
複製代碼
與之相對的概念就是超集:
let intSetA: Set = [1,2,3,4,5,6,7,8,9,0]
let intSetC: Set = [3,4,5]
intSetA.isSuperset(of: intSetC) //true
intSetA.isStrictSuperset(of: intSetC) //true
複製代碼
若是兩個集合沒有相同的元素,那麼就說這兩個集合不相交
let intSetA: Set = [1,2,3,4,5,6,7,8,9,0]
let intSetC: Set = [3,4,5]
let intSetD: Set = [13,14,15]
intSetA.isDisjoint(with: intSetC) //false
intSetA.isDisjoint(with: intSetD) //true
複製代碼
你能夠將兩個集合合併成爲一個新集合,新的集合中包含兩個集合中全部的元素:
let stringSetA: Set = ["a","b","c"]
let stringSetB: Set = ["c","d","e"]
let unionSetAB = stringSetA.union(stringSetB)
print(unionSetAB) //["d", "b", "c", "a", "e"]
複製代碼
另外一方面,交集就是僅包含兩個集合中共同的元素:
let stringSetA: Set = ["a","b","c"]
let stringSetB: Set = ["c","d","e"]
let intersectionAB = stringSetA.intersection(stringSetB)
print(intersectionAB) //[「c」]
複製代碼
你能夠在集合中存儲自定義的類型。這種類型能夠是類或者結構體。爲了能正常使用集合,該類型必須遵循 hashable
協議。
class Movie: Hashable {
var title: String
var year: Int
init(title: String, year: Int) {
self.title = title
self.year = year
}
static func == (lhs: Movie, rhs: Movie) -> Bool {
return lhs.title == rhs.title &&
lhs.year == rhs.year
}
var hashValue: Int {
return title.hashValue ^ year.hashValue
}
}
let terminator = Movie(title: "Terminator", year: 1980)
let backToTheFuture = Movie(title: "Back to the Future", year: 1985)
let movieSetA: Set = [terminator,backToTheFuture]
複製代碼
本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 swift.gg。