窺探Swift之數組與字典

說到數組和字典,只要是編過程的小夥伴並不陌生。在Swift中的數組與字典也有着一些讓人眼前一亮的特性,今天的博客就來窺探一下Swift中的Array和Dictionary。仍是沿襲以前的風格,在介紹Swift中的數組時,咱們會對比一下ObjC中的數組和字典,由於ObjC也是iOS開發的主要語言不是。不管是簡單仍是複雜的程序,數組和字典的用處仍是比較多的,這二者雖然是Swift的基礎內容,可是也不失其重要性。關於Objc的集合類請參考以前的博客Objective-C中的集合類html

1、Swift中的數組(Array)編程

數組在其餘編程語言中都是存在的,數組就是一組數的集合。雖然其餘編程語言中都有數組,可是不一樣語言中的數組都有着一些屬於本身的特性。Swift也不例外,Swift中的數組使用起來仍是比較人性化的.數組

1.數組的聲明與建立app

在聊Swift中的Array聲明建立以前,我想聊一下ObjC中數組的聲明與建立,下方是ObjC中不可變數組和可變數組的建立方式。在ObjC中可使用NSArray來聲明不可變數組,使用NSMutableArray來聲明可變數組。編程語言

1     NSArray *objcArray01 = [NSArray array];
2     NSArray *objcArray02 = @[@(1), @(2)];
3     
4     NSMutableArray *mutableArray = [NSMutableArray array];

而在Swift語言中,你可使用關鍵字let來聲明不可變數組,使用var來聲明可變數組,下方代碼聲明的是Swift中的可變數組的幾種方式。有一點須要注意的是ObjC中的數組只容許往裏面存儲對象,而不容許往裏存儲基本數據類型(Int, Float等)。而在Swift中是容許把基本數據類型存入數組中的,以下方代碼段所示。下方給出了數組的三種定義的方式。後兩種給數組元素制定了數據類型,表示該數組中只可以存儲Int類型的值,若是你往裏存入了其餘的值,對不起,編譯器會報錯的。函數

在Swift的數組中,若是在聲明數組時沒有指定數組中元素的數據類型,那麼數組中是能夠存放不一樣數據類型的數據的。若是你指定了數組中只容許存儲一種數據類型,若是你再往裏存儲其餘數據類型的話,那就是你的不對了,編譯器回給你指出你的錯誤。具體以下所示:post

 

2.數組的操做url

(1)可變與不可變數組spa

若是你想對數組中的元素進行增長、修改或者刪除,那麼你須要把Array定義成可變數組。若是你把數組定義成了不可變數組,可是你又對他進行了操做,那就是你的不對了。不管是ObjC仍是Swift都不容許對不可變數組這位高冷的「御姐」動手動腳,否則會拋出一個錯誤的。可是可變數組就不同了,你能夠對可變數組進行增刪改查操做。3d

下圖是在ObjC中對NSArray操做後的結果,你不能對NSArray中的元素進行修改,也就是說你對NSArray的操做權限只有讀的權限,沒有寫的權限。若是你想對數組進行讀寫的權限的話,那你就有必要使用可變數組NSMutableArray了。使用NSMutableArray就不會報錯,由於你對它有讀寫的權限。

在Swift中的可變數組和不可變數組歸根結底仍是變量和常量也就是var和let關鍵字的使用了。你對變量持有讀寫的權限,對常量持有讀的權限。下方的小實例,本質仍是對let和var的討論,下方是Swift實例:

  

(2) 插入元素

上面Swift實例中已經展現瞭如何往數組中插入元素。Swift中往數組中插入元素和OC中使用的方法是同樣的,只是調用方法的方式不一樣。下方代碼就是往可變數組arrayTest中的索引1的位置插入一個值「Objc」。語法比較簡單就不作過多的贅述了。

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

 

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

你可使用append函數來往數組的尾部追加值。若是你想把另外一個數組追加到一個數組的後方,你可使用+=運算符來操做。使用+=能夠鏈接數組,這也是Swift中使人興奮的一個特色。具體操做請看下方的實例:

 

(4)移除元素

上面是添加,接下來要搞一下移除元素。其實Swift中數組移除的方法名和用法和Objective-C中移除可變數組中的元素的方式極爲類似。下方截圖中是常用的移除方法,用法都沒有什麼難理解的地方,在此就簡單的聊上一嘴。

Void removeAll(): 移除數組中所有元素,有一個可選參數,keepCapacity。若是keepCapacity = YES的話,那麼數組移除元素後,其存儲空間仍是存在的,在此往裏存儲值,不需再給他分配存儲空間了。若是keepCapacity=NO的話,那麼數組的存儲空間就會被回收掉。

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

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

    Void removeFirst(n: Int): 這個函數的意思是移除數組前方的幾個元素,若是n = 1, 的話就移除前面一個元素這時與String removeFirst()函數功能相同。若是n = 3, 就移除前3個元素。

    String removeLast(): 移除數組中最後一個元素。

Void removeRange(subRange: Range<Int>): 這個函數就比較全能呢,它能夠移除數組中有效範圍內的連續元素。它須要一個Range參數,下方是這個函數的使用方法,Range的起始位置是1,結束位置是2,就是移除索引1到2之間的元素。能夠看Playground中的提示。 Range(start:1, end:2) 表明着半開區間1..<2。

 

3. 使用Array構造函數給數組賦初始值

在一些應用場景中咱們須要爲數組中的每一項進行初始化,也就是給數組的每一項賦上初始值。舉個栗子~,好比咱們要使用一個數組來記錄公司每一個季度的銷售額,在數組初始化時,咱們給給數組初始化4個初始值爲零的元素。接下來就使用Array構造函數來作一些事情。下方就是在數組建立時給數組賦初始值。

 

2、Swift中的字典(Dictionary)

Swift中字典和Objective-C中的字典除了語法不同外,用法也是大同小異的。字典中存放的就是Key和Value也就是鍵值對。能夠經過Key來取出Value的值,在PHP這門強大的語言中,Array和Dictionary就是一個東西。其實數組就是一種特殊的字典,數組的key就是其下標,只不過這個下標不須要你去指定,由系統分配好,而且是元素在數組中是按下標從小到大排列的。在字典中的鍵值對是沒有固定順序的。

1. 字典的建立

在Swift中字典的建立和數組的建立也是相似的,就是比數組的item多了一個key。下方建立了兩個字典,第一個字典是指定了key與value的數據類型,第二個字典沒有爲鍵值指定固定的數據類型。從Playground中咱們容易的看出字典中的數據是沒有固定數據的,由於讀取字典中的值是經過key-value的形式而不是經過下標的方式。下方建立的都是可變字典,由於咱們使用的是var關鍵字進行修飾的,若是你要建立不可變數組,咱們就可使用let關鍵字進行建立。關於let建立字典的內容,在此就不作過多的贅述了,由於只須要把下方的var換成let便可。

    

2. 字典item的增刪改查

(1) 查詢字典的值(讀取)

咱們能夠經過字典鍵值對的key來取出key對應的value。 下方的代碼是分別取出「大毛」和「小黃」的值,以下所示:

(2)字典的遍歷

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

上述代碼段輸出結果以下,由輸出結果可知,每一個Value是可選類型的數據:

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

===============================================================================

上面是獲取字典中的全部keys, 那麼下面是獲取字典中的全部values, 具體代碼以下所示:

上述代碼段輸出的結果值以下:

1         value:黃2
2         value:小黃
3         value:大黃        

===============================================================================

接下來就是對字典的整個item進行遍歷,每一個item遍歷出來是一個元組。元組的內容是(key, value)。遍歷出來的元組咱們就能夠經過使用元組的形式來獲取字典的key和value。具體代碼以下所示:

輸出結果以下:

 1         元組:(2, "黃2")
 2         key: 2
 3         value: 黃2
 4 
 5         元組:(3, "小黃")
 6         key: 3
 7         value: 小黃
 8 
 9         元組:(1, "大黃")
10         key: 1
11         value: 大黃

 

(3) 字典的修改

字典元素的修改是比較簡單的,下方經過兩種。第一種是經過key的形式直接給key對應的value賦值,不過這種修改方式是不會返回被修改的值的,具體代碼以下:

若是你想在修改值的時候返回被修改的原始值的話,你須要使用updateValue(forKey:)方法進行元素的修改。該函數是能夠返回被修改的原始值的,具體實例以下所示:

 

(4) 增長元素

往已有的可變字典中增長元素就簡單多了,直接經過key就能夠給value賦值。在可變字典中,若是key已經存在,那麼就變成上面的修改字典的值了。能夠這麼理解,經過key給value賦值時,若是key存在,就覆蓋原有的鍵值對,若是不存在就添加。下方就是往字典中進行添加元素的語句:

 

(5)移除元素

下方截圖中是全部字典移除元素的方法,

        removeAll():移除全部元素。

        removeAll(keepCapacity: Bool):移除全部元素, 若是keepCapacity爲True,則保留字典原有的存儲空間。

        removeValueForkey(key: Hashable): 這個方法是經過key來移除元素的。

removeAtIndex(index: DictionaryIndex<Hashable, Value>):這個是經過Dictionary的索引來刪除元素的。可是字典的item是沒有順序的,那麼咱們怎麼獲取這個DictionaryIndex呢? 那麼咱們就會使用到另外一個函數,就是indexForKey。具體用法以下,移除元素成功後會以元組的形式返回被刪除的值。

相關文章
相關標籤/搜索