窺探Swift之數組與字典


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

一、Swift中的數組(Array)

數組在其他編程語言中都是存在的,數組就是一組數的集合。雖然其他編程語言中都有數組,但是不同語言中的數組都有着一些屬於自己的特性。Swift也不例外,Swift中的數組使用起來還是比較人性化的.

1.數組的聲明與創建

在聊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的數組中,如果在聲明數組時沒有指定數組中元素的數據類型,那么數組中是可以存放不同數據類型的數據的。如果你指定了數組中只允許存儲一種數據類型,如果你再往里存儲其他數據類型的話,那就是你的不對了,編譯器回給你指出你的錯誤。具體如下所示:

 

2.數組的操作

(1)可變與不可變數組

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

下圖是在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構造函數來做一些事情。下方就是在數組創建時給數組賦初始值。

 

二、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。具體用法如下,移除元素成功后會以元組的形式返回被刪除的值。

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM