Swift 中的集合(Set)

做者:Thomas Hanning,原文連接,原文日期:2018-09-06git

譯者:rsenjoyer;校對:numbbbbbpmst;定稿:Forelaxgithub

集合(Set)是 Swift 集合類型(collection types)之一,集合用來存儲類型相同且沒有肯定順序惟一的值。你能夠將集合想象成一盒檯球:它們在顏色和數量上獨一無二,但在盒內是無序的。swift

提示:這篇文章使用的是 Swift 4 和 Xcode 10數組

建立集合

建立一個集合很是簡單:ui

let setA: Set<String> = ["a","b","c"]
複製代碼

在這個例子中,建立一個 String 類型的集合,命名爲 setA。它存儲着 abc 三個值。與數組相比,集合內元素是無序的。經過編譯器的類型推導功能,你也能夠像以下方式建立集合: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

相關文章
相關標籤/搜索