概述:
Set和Array的區(qū)別在于,Set是無序的,且Set中不能存在重復(fù)的元素(可以快速地驗(yàn)證Set中是否存在某一元素),此外Set中的元素需是符合Hashable協(xié)議的類型(字符串類型,數(shù)值類型,布爾類型,沒有關(guān)聯(lián)值的枚舉類型,Set類型等都是符合Hashable的類型)。
利用數(shù)組字面值可直接創(chuàng)建Set

Set的相關(guān)操作:
.contains(_:) 查看Set中是否含有某一特定元素
== 判斷兩個(gè)Set所包含的元素是否都相等
.isSubset(of:) 判斷當(dāng)前Set是否是參數(shù)中的Set的子集
.isStrictSubset(of:) 判斷當(dāng)前Set是否是參數(shù)中的Set的真子集
.isSuperset(of:) 判斷當(dāng)前Set是否含有參數(shù)中的Set或序列的所有元素
.isDisjoint(with:) 判斷當(dāng)前Set和參數(shù)中的Set是否含有相同的元素,若沒有返回true,否則返回false
.union(_:) 返回兩個(gè)Set的并集
.intersection(_:) 返回兩個(gè)Set的交集
.symmetricDifference(_:)?返回兩個(gè)Set中除了交集元素外的所有元素的集合
.subtracting(_:) 返回兩個(gè)集合的差集
.formUnion(_:) | .formIntersection(_:) | formSymmetricDifference(_:) | .subtract(_:) 這四個(gè)函數(shù)的功能與上述四個(gè)函數(shù)的功能類似,差別在于是上方的函數(shù)都返回一個(gè)新的Set而不改變當(dāng)前的Set的值,而下方的四個(gè)函數(shù)將所得到的結(jié)果賦予當(dāng)前的Set。
Set的相關(guān)操作既可以用于Set之間,也可以用于Set和Array,Set和Sequence(序列)之間的操作

集合或序列中可用于Set的操作:
任何集合或序列中的immutating操作(不改變Set的值)都可用于Set

使用for-in遍歷Set中的元素(遍歷順序不確定)

很多序列或集合中的操作的返回值類型是Array或無類型的集合而不是Set,需要顯式地將運(yùn)算結(jié)果轉(zhuǎn)化成Set

Set和NSSet之間的橋接:
使用類型轉(zhuǎn)換操作符 as 可完成Set和NSSet之間的橋接
為了完成Set到NSSet的橋接,要求Set中的元素必須是class類型,符合@objc protocol的類型或者可以與Foundation中的類型相橋接的類型(String, Int,F(xiàn)loat等)
Set到NSSet的橋接的時(shí)間復(fù)雜度和空間復(fù)雜度總是O(1), ?但當(dāng)Set中的元素不是class類型也不是符合@objc protocol的類型時(shí),Set中的元素到OC中相關(guān)類型的橋接總是發(fā)生在第一次訪問Set中的元素時(shí),時(shí)間復(fù)雜度為O(n)。
NSSet到Set的橋接會(huì)調(diào)用NSSet的copy(with:)方法得到NSSet的不可修改的副本(時(shí)間復(fù)雜度不確定)并進(jìn)行額外的Swift的統(tǒng)計(jì)工作(時(shí)間復(fù)雜度為O(1)),如果NSSet已經(jīng)是不可修改的,那么copy(with:)方法返回同一個(gè)set(時(shí)間復(fù)雜度為O(1)),并且與橋接后得到的Set共享同一存儲(chǔ)空間,采用copy-on-write的方法對(duì)該內(nèi)存存儲(chǔ)進(jìn)行優(yōu)化。