Swift--Set 詳解

概述:

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

利用數(shù)組字面值可直接創(chuàng)建Set

創(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與其他類型之間的操作


集合或序列中可用于Set的操作:

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

??集合或序列中可用于Set的操作

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

Set的遍歷

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


參考文獻(xiàn):

蘋果官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,674評(píng)論 1 32
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,146評(píng)論 2 9
  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,569評(píng)論 0 4
  • 四、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 876評(píng)論 0 2
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,717評(píng)論 0 5

友情鏈接更多精彩內(nèi)容