Swift 集合(Set)

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)于使用FoundationCocoaSet的知識,參見 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)用Setinsert(_:)方法來添加一個新元素:

favoriteGenres.insert("Jazz")
// favoriteGenres 現(xiàn)在包含4個元素

可以通過調(diào)用Set的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

SetsOperationResult.png

  • 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

SetsRelationship.png

  • ==運算符:
    判斷兩個集合是否包含全部相同的值
  • 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栈妆,一起剝皮案震驚了整個濱河市胁编,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳞尔,老刑警劉巖嬉橙,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寥假,居然都是意外死亡市框,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門糕韧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枫振,“玉大人,你說我怎么就攤上這事萤彩》嗦耍” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵雀扶,是天一觀的道長杖小。 經(jīng)常有香客問我,道長愚墓,這世上最難降的妖魔是什么予权? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮浪册,結(jié)果婚禮上扫腺,老公的妹妹穿的比我還像新娘。我一直安慰自己议经,他們只是感情好斧账,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布谴返。 她就那樣靜靜地躺著煞肾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪籍救。 梳的紋絲不亂的頭發(fā)上习绢,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天蝙昙,我揣著相機與錄音,去河邊找鬼奇颠。 笑死,一個胖子當著我的面吹牛烈拒,可吹牛的內(nèi)容都是我干的圆裕。 我是一名探鬼主播荆几,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吓妆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吨铸?” 一聲冷哼從身側(cè)響起行拢,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诞吱,沒想到半個月后舟奠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡房维,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年鸭栖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片握巢。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡晕鹊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暴浦,到底是詐尸還是另有隱情溅话,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布歌焦,位于F島的核電站飞几,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏独撇。R本人自食惡果不足惜屑墨,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一躁锁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卵史,春花似錦战转、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忧设,卻和暖如春刁标,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背址晕。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工膀懈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谨垃。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓启搂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乘客。 傳聞我的和親對象是個殘疾皇子狐血,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章易核,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,754評論 2 9
  • 前言 3月27號蘋果發(fā)布了Swift3.1匈织,官方教程也更新到了3.1,查看更新記錄發(fā)現(xiàn)更新的內(nèi)容對之前的文章并沒有...
    BoomLee閱讀 3,138評論 0 4
  • 用來存儲相同類型并且沒有確定順序的值牡直。當集合元素順序不重要時或者希望確保每個元素只出現(xiàn)一次 時可以使用集合而不是數(shù)...
    GavinKang閱讀 705評論 0 0
  • 本章將會介紹 數(shù)組類型(Arrays)集合類型(Sets)字典(Dictionaries)控制流 數(shù)組類型(Arr...
    寒橋閱讀 698評論 0 2
  • 體驗:今天C62.4全部安裝完畢湃番,用四天完成確實很慢這是第一次,所以會越來越好吠撮,越來越快讲竿,核心弄屡、總結(jié)經(jīng)驗鞋诗,轉(zhuǎn)身用:...
    郭家樂閱讀 145評論 0 0