欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

探討Swift數(shù)組和字典

 更新時(shí)間:2015年12月11日 10:45:00   作者:青玉伏案  
Swift數(shù)組是具體的。他不同于Objective-C的的NSArray和NSMutableArray里的類(lèi),它可以存儲(chǔ)任何類(lèi)型的對(duì)象,不提供有關(guān)它們返回的對(duì)象的性質(zhì)的任何信息

數(shù)組是一個(gè)存儲(chǔ)多個(gè)相同類(lèi)型的值的有序列表。相同的值,可以在不同的位置出現(xiàn)在一個(gè)數(shù)組中的多個(gè)次。
Swift數(shù)組是具體的。他不同于Objective-C的的NSArray和NSMutableArray里的類(lèi),它可以存儲(chǔ)任何類(lèi)型的對(duì)象,不提供有關(guān)它們返回的對(duì)象的性質(zhì)的任何信息。在斯Swift,一個(gè)特定的數(shù)組可以存儲(chǔ)的值類(lèi)型總是明確的,無(wú)論是通過(guò)顯式類(lèi)型批注,或通過(guò)類(lèi)型推斷,而不一定是類(lèi)類(lèi)型。如果創(chuàng)建詮釋值的數(shù)組,例如,你不能插入比Int值以外的任何值到該數(shù)組。Swift數(shù)組是類(lèi)型安全的,并且總是清楚它們可能含有什么。

數(shù)組語(yǔ)法

數(shù)組的類(lèi)型是Array<SomeType>,其中個(gè)SomeType是該數(shù)組允許存儲(chǔ)的類(lèi)型。你也可以寫(xiě)簡(jiǎn)寫(xiě)形式數(shù)組的類(lèi)型為個(gè)SomeType[]。雖然兩種形式在功能上是相同的,簡(jiǎn)寫(xiě)形式是首選,而指的是一個(gè)數(shù)組類(lèi)型時(shí)使用本指南。

說(shuō)到數(shù)組和字典,只要是編過(guò)程的小伙伴并不陌生。在Swift中的數(shù)組與字典也有著一些讓人眼前一亮的特性,今天的博客就來(lái)窺探一下Swift中的Array和Dictionary。還是沿襲之前的風(fēng)格,在介紹Swift中的數(shù)組時(shí),我們會(huì)對(duì)比一下ObjC中的數(shù)組和字典,因?yàn)镺bjC也是iOS開(kāi)發(fā)的主要語(yǔ)言不是。無(wú)論是簡(jiǎn)單還是復(fù)雜的程序,數(shù)組和字典的用處還是比較多的,這兩者雖然是Swift的基礎(chǔ)內(nèi)容,但是也不失其重要性。關(guān)于Objc的集合類(lèi)請(qǐng)參考之前的博客《Objective-C中的集合類(lèi)》。

  一、Swift中的數(shù)組(Array)

    數(shù)組在其他編程語(yǔ)言中都是存在的,數(shù)組就是一組數(shù)的集合。雖然其他編程語(yǔ)言中都有數(shù)組,但是不同語(yǔ)言中的數(shù)組都有著一些屬于自己的特性。Swift也不例外,Swift中的數(shù)組使用起來(lái)還是比較人性化的.

    1.數(shù)組的聲明與創(chuàng)建

    在聊Swift中的Array聲明創(chuàng)建之前,我想聊一下ObjC中數(shù)組的聲明與創(chuàng)建,下方是ObjC中不可變數(shù)組和可變數(shù)組的創(chuàng)建方式。在ObjC中可以使用NSArray來(lái)聲明不可變數(shù)組,使用NSMutableArray來(lái)聲明可變數(shù)組。

 NSArray *objcArray = [NSArray array];
   NSArray *objcArray = @[@(), @()];
   NSMutableArray *mutableArray = [NSMutableArray array]; 

    而在Swift語(yǔ)言中,你可以使用關(guān)鍵字let來(lái)聲明不可變數(shù)組,使用var來(lái)聲明可變數(shù)組,下方代碼聲明的是Swift中的可變數(shù)組的幾種方式。有一點(diǎn)需要注意的是ObjC中的數(shù)組只允許往里面存儲(chǔ)對(duì)象,而不允許往里存儲(chǔ)基本數(shù)據(jù)類(lèi)型(Int, Float等)。而在Swift中是允許把基本數(shù)據(jù)類(lèi)型存入數(shù)組中的,如下方代碼段所示。下方給出了數(shù)組的三種定義的方式。后兩種給數(shù)組元素制定了數(shù)據(jù)類(lèi)型,表示該數(shù)組中只能夠存儲(chǔ)Int類(lèi)型的值,如果你往里存入了其他的值,對(duì)不起,編譯器會(huì)報(bào)錯(cuò)的。

    在Swift的數(shù)組中,如果在聲明數(shù)組時(shí)沒(méi)有指定數(shù)組中元素的數(shù)據(jù)類(lèi)型,那么數(shù)組中是可以存放不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)的。如果你指定了數(shù)組中只允許存儲(chǔ)一種數(shù)據(jù)類(lèi)型,如果你再往里存儲(chǔ)其他數(shù)據(jù)類(lèi)型的話(huà),那就是你的不對(duì)了,編譯器回給你指出你的錯(cuò)誤。具體如下所示:

 

  2.數(shù)組的操作

    (1)可變與不可變數(shù)組

    如果你想對(duì)數(shù)組中的元素進(jìn)行增加、修改或者刪除,那么你需要把Array定義成可變數(shù)組。如果你把數(shù)組定義成了不可變數(shù)組,但是你又對(duì)他進(jìn)行了操作,那就是你的不對(duì)了。無(wú)論是ObjC還是Swift都不允許對(duì)不可變數(shù)組這位高冷的“御姐”動(dòng)手動(dòng)腳,不然會(huì)拋出一個(gè)錯(cuò)誤的。但是可變數(shù)組就不一樣了,你可以對(duì)可變數(shù)組進(jìn)行增刪改查操作。

    下圖是在ObjC中對(duì)NSArray操作后的結(jié)果,你不能對(duì)NSArray中的元素進(jìn)行修改,也就是說(shuō)你對(duì)NSArray的操作權(quán)限只有讀的權(quán)限,沒(méi)有寫(xiě)的權(quán)限。如果你想對(duì)數(shù)組進(jìn)行讀寫(xiě)的權(quán)限的話(huà),那你就有必要使用可變數(shù)組NSMutableArray了。使用NSMutableArray就不會(huì)報(bào)錯(cuò),因?yàn)槟銓?duì)它有讀寫(xiě)的權(quán)限。

    在Swift中的可變數(shù)組和不可變數(shù)組歸根結(jié)底還是變量和常量也就是var和let關(guān)鍵字的使用了。你對(duì)變量持有讀寫(xiě)的權(quán)限,對(duì)常量持有讀的權(quán)限。下方的小實(shí)例,本質(zhì)還是對(duì)let和var的討論,下方是Swift實(shí)例: 

    (2) 插入元素

     上面Swift實(shí)例中已經(jīng)展示了如何往數(shù)組中插入元素。Swift中往數(shù)組中插入元素和OC中使用的方法是一樣的,只是調(diào)用方法的方式不同。下方代碼就是往可變數(shù)組arrayTest中的索引1的位置插入一個(gè)值“Objc”。語(yǔ)法比較簡(jiǎn)單就不做過(guò)多的贅述了。

arrayTest.insert("Objc", atIndex: 1); 

    (3) 元素以及數(shù)組的追加

    你可以使用append函數(shù)來(lái)往數(shù)組的尾部追加值。如果你想把另一個(gè)數(shù)組追加到一個(gè)數(shù)組的后方,你可以使用+=運(yùn)算符來(lái)操作。使用+=可以連接數(shù)組,這也是Swift中令人興奮的一個(gè)特點(diǎn)。具體操作請(qǐng)看下方的實(shí)例:

    (4)移除元素

    上面是添加,接下來(lái)要搞一下移除元素。其實(shí)Swift中數(shù)組移除的方法名和用法和Objective-C中移除可變數(shù)組中的元素的方式極為相似。下方截圖中是經(jīng)常使用的移除方法,用法都沒(méi)有什么難理解的地方,在此就簡(jiǎn)單的聊上一嘴。

    Void removeAll(): 移除數(shù)組中全部元素,有一個(gè)可選參數(shù),keepCapacity。如果keepCapacity = YES的話(huà),那么數(shù)組移除元素后,其存儲(chǔ)空間還是存在的,在此往里存儲(chǔ)值,不需再給他分配存儲(chǔ)空間了。如果keepCapacity=NO的話(huà),那么數(shù)組的存儲(chǔ)空間就會(huì)被回收掉。

    String removeAtIndex(): 移除指定索引的元素,并且返回被移除的元素。

    String removeFrist(): 移除第一個(gè)元素,并返回被移除的元素。

    Void removeFirst(n: Int): 這個(gè)函數(shù)的意思是移除數(shù)組前方的幾個(gè)元素,如果n = 1, 的話(huà)就移除前面一個(gè)元素這時(shí)與String removeFirst()函數(shù)功能相同。如果n = 3, 就移除前3個(gè)元素。

    String removeLast(): 移除數(shù)組中最后一個(gè)元素。 

    Void removeRange(subRange: Range<Int>): 這個(gè)函數(shù)就比較全能呢,它可以移除數(shù)組中有效范圍內(nèi)的連續(xù)元素。它需要一個(gè)Range參數(shù),下方是這個(gè)函數(shù)的使用方法,Range的起始位置是1,結(jié)束位置是2,就是移除索引1到2之間的元素??梢钥碢layground中的提示。 Range(start:1, end:2) 代表著半開(kāi)區(qū)間1..<2。

  3. 使用Array構(gòu)造函數(shù)給數(shù)組賦初始值

    在一些應(yīng)用場(chǎng)景中我們需要為數(shù)組中的每一項(xiàng)進(jìn)行初始化,也就是給數(shù)組的每一項(xiàng)賦上初始值。舉個(gè)栗子~,比如我們要使用一個(gè)數(shù)組來(lái)記錄公司每個(gè)季度的銷(xiāo)售額,在數(shù)組初始化時(shí),我們給給數(shù)組初始化4個(gè)初始值為零的元素。接下來(lái)就使用Array構(gòu)造函數(shù)來(lái)做一些事情。下方就是在數(shù)組創(chuàng)建時(shí)給數(shù)組賦初始值。 

  二、Swift中的字典(Dictionary)

    Swift中字典和Objective-C中的字典除了語(yǔ)法不一樣外,用法也是大同小異的。字典中存放的就是Key和Value也就是鍵值對(duì)??梢酝ㄟ^(guò)Key來(lái)取出Value的值,在PHP這門(mén)強(qiáng)大的語(yǔ)言中,Array和Dictionary就是一個(gè)東西。其實(shí)數(shù)組就是一種特殊的字典,數(shù)組的key就是其下標(biāo),只不過(guò)這個(gè)下標(biāo)不需要你去指定,由系統(tǒng)分配好,并且是元素在數(shù)組中是按下標(biāo)從小到大排列的。在字典中的鍵值對(duì)是沒(méi)有固定順序的。

    1. 字典的創(chuàng)建

    在Swift中字典的創(chuàng)建和數(shù)組的創(chuàng)建也是類(lèi)似的,就是比數(shù)組的item多了一個(gè)key。下方創(chuàng)建了兩個(gè)字典,第一個(gè)字典是指定了key與value的數(shù)據(jù)類(lèi)型,第二個(gè)字典沒(méi)有為鍵值指定固定的數(shù)據(jù)類(lèi)型。從Playground中我們?nèi)菀椎目闯鲎值渲械臄?shù)據(jù)是沒(méi)有固定數(shù)據(jù)的,因?yàn)樽x取字典中的值是通過(guò)key-value的形式而不是通過(guò)下標(biāo)的方式。下方創(chuàng)建的都是可變字典,因?yàn)槲覀兪褂玫氖莢ar關(guān)鍵字進(jìn)行修飾的,如果你要?jiǎng)?chuàng)建不可變數(shù)組,我們就可以使用let關(guān)鍵字進(jìn)行創(chuàng)建。關(guān)于let創(chuàng)建字典的內(nèi)容,在此就不做過(guò)多的贅述了,因?yàn)橹恍枰严路降膙ar換成let即可。

    2. 字典item的增刪改查

    (1) 查詢(xún)字典的值(讀?。?br />

      我們可以通過(guò)字典鍵值對(duì)的key來(lái)取出key對(duì)應(yīng)的value。 下方的代碼是分別取出“大毛”和“小黃”的值,如下所示:

 

    (2)字典的遍歷

      只取一個(gè)值那多不爽呢,下面介紹一下字典的遍歷方法。下方是遍歷輸出字典myDog中所有的key,字典的keys屬性是獲取字典中所有的key值。

      上述代碼段輸出結(jié)果如下,由輸出結(jié)果可知,每個(gè)Value是可選類(lèi)型的數(shù)據(jù):

        key: Optional("黃2")
        key: Optional("小黃")
        key: Optional("大黃") 

      上面是獲取字典中的所有keys, 那么下面是獲取字典中的所有values, 具體代碼如下所示:

 

      上述代碼段輸出的結(jié)果值如下:

    value:黃
     value:小黃
     value:大黃    
 

      接下來(lái)就是對(duì)字典的整個(gè)item進(jìn)行遍歷,每個(gè)item遍歷出來(lái)是一個(gè)元組。元組的內(nèi)容是(key, value)。遍歷出來(lái)的元組我們就可以通過(guò)使用元組的形式來(lái)獲取字典的key和value。具體代碼如下所示:

      輸出結(jié)果如下:      

 元組:(, "黃")
     key: 
     value: 黃
     元組:(, "小黃")
     key: 
     value: 小黃
     元組:(, "大黃")
     key: 
     value: 大黃 

    (3) 字典的修改

      字典元素的修改是比較簡(jiǎn)單的,下方通過(guò)兩種。第一種是通過(guò)key的形式直接給key對(duì)應(yīng)的value賦值,不過(guò)這種修改方式是不會(huì)返回被修改的值的,具體代碼如下:

 

      如果你想在修改值的時(shí)候返回被修改的原始值的話(huà),你需要使用updateValue(forKey:)方法進(jìn)行元素的修改。該函數(shù)是可以返回被修改的原始值的,具體實(shí)例如下所示:

 

     (4) 增加元素

      往已有的可變字典中增加元素就簡(jiǎn)單多了,直接通過(guò)key就可以給value賦值。在可變字典中,如果key已經(jīng)存在,那么就變成上面的修改字典的值了??梢赃@么理解,通過(guò)key給value賦值時(shí),如果key存在,就覆蓋原有的鍵值對(duì),如果不存在就添加。下方就是往字典中進(jìn)行添加元素的語(yǔ)句: 

    (5)移除元素

      下方截圖中是所有字典移除元素的方法,

        removeAll():移除所有元素。

        removeAll(keepCapacity: Bool):移除所有元素, 如果keepCapacity為T(mén)rue,則保留字典原有的存儲(chǔ)空間。

        removeValueForkey(key: Hashable): 這個(gè)方法是通過(guò)key來(lái)移除元素的。

removeAtIndex(index: DictionaryIndex<Hashable, Value>):這個(gè)是通過(guò)Dictionary的索引來(lái)刪除元素的。但是字典的item是沒(méi)有順序的,那么我們?cè)趺传@取這個(gè)DictionaryIndex呢? 那么我們就會(huì)使用到另一個(gè)函數(shù),就是indexForKey。具體用法如下,移除元素成功后會(huì)以元組的形式返回被刪除的值。


相關(guān)文章

最新評(píng)論