天天看點

6.Swift教程翻譯系列——Swift集合類型

Swift提供數組和字典兩種集合類型。用來存儲很多值的情況。數組有序的存儲一組同樣類型的值。字典也存儲一組同樣類型的值可是是無序的。字典中存儲的值能夠通過一個唯一的辨別(也就是Key)來查找。

在Swift中,數組和字典總是清楚自己能存儲的值的類型和key的類型。也就是說你不會錯誤的把其它不正确應的類型存進數組或者字典。是以你也能确定從數組或者字典中取出來的值的類型肯定也不會錯了。Swift使用顯式類型集合來保證你的代碼總是能清除的知道數組和字典中存儲的值的類型,確定你在開發階段就能發現全部類型錯誤。

NOTE 當你将數組指派給其它變量或者常量,或者傳遞給函數或方法的時候。數組的行為跟其它類型是不太一樣的。很多其它資訊在可變集合與集合類型指派與拷貝裡面介紹。

1.數組

數組能夠以有序狀态存儲同一類型的多個值。同一個值也能夠在同一個數組的不同位置多次出現。

Swift數組能存儲的值的類型是特定的。他跟OC的NSArray或者NSMutableArray類不一樣,這兩個類能夠存儲不論什麼對象,不用說明他們傳回的值是什麼類型。

可是在Swift裡,特定的數組能存儲的值的類型必需要說明清楚,要麼是通過類型标注,要麼通過類型判斷。并且不需要一定是class類型。假設你建立一個Int值的數組。你就不能向這個數組裡面存儲除了Int類型意外的不論什麼值。Swift數組總是類型安全的,總是清除數組能夠存儲什麼類型。

數組類型簡寫

Swift數組的類型完整形式是Array<SomeType>這種。SomeType就是數組同意存儲的類型。你也能夠使用簡寫形式SomeType[]。盡管說兩種形式功能是同樣的。可是更推薦使用簡寫形式,這本手冊也将採取簡寫形式。

數組字面值

你能夠使用數組字面值來初始化數組。這是将一個或多個值定義成數組的簡寫方式。

數組字面值形式是一組值以逗号分隔,外面再加上中括号。比方[value 1, value 2, value 3]。

以下樣例建立了一個數組shoppingList來存數字元串

變量shoppingList被聲明為“字元串值的數組”。寫作String[]。由于這個數組被聲明是字元串類型。是以這個數組就僅僅能存儲字元串。這裡shoppingList數組被使用兩個字元串值的數組字面值來初始化。

NOTE 注意上面數組shoppingList是被聲明為變量而不是常量。由于後面樣例中還要向這個數組中加入很多其它地元素。

在這個樣例中數組字面值僅僅包括了兩個字元串,正好比對shoppingList的聲明(僅僅能存儲字元串類型的數組),是以使用字面值指派被同意用來初始化數組shoppingList。

由于Swift有類型判斷機制。是以當你使用僅僅包括一種類型的數組字面值來初始化數組的時候是能夠不用指明數組類型的。上面shoppingList的聲明能夠這條語句取代 var shoppingList = ["Eggs", "Milk"] 由于用來初始化的數組字面值包括的類型都是同樣的,是以Swift能夠判斷出Sring[]就是用來聲明shoppingList的正确類型。

擷取和改動數組

你能夠通過數組的方法或者屬性或者使用下智語法來擷取和改動數組。

要想知道數組擁有幾個元素。能夠通過數組的僅僅讀屬性count

使用屬性isEmpty能夠作推斷count屬性是否為0

你能夠通過調用append方法來向數組的末尾加入元素

或者也能夠使用+=操作符來向數組末尾加入元素:

你還能夠使用+=符号來向數組中加入一個類型比對的數組:

假設要擷取數組中的值就用下智語法,在數組名後面加上中括号。中括号中面寫你想要擷取的值的序号:

注意數組中第一個元素的下标是0而不是1。

Swift中的數組下标都是從0開始的。

你能夠使用下智語法來改動已經存在數組中的值:

你還能夠使用下智語法一次性改動多個值,即使要替換的數組長度跟使用的下标範圍長度不一樣都行。以下樣例把"chocolate Spread",”Cheese“,”Butter“替換成"Bananas"和"Apples":

NOTE 不能夠使用下智語法來向數組末尾加入元素。假設你使用下智語法的時候使用了超出數組現有下标範圍的數值,将會發生執行時錯誤。隻是你能夠在使用下标的時候先通過比較該下标是否不大于數組的count屬性來檢測是否越界。除了count是0得情況,數組能夠使用的最大下标總是count-1。

假設要再數組特定位置插入元素,須要調用數組的方法insert(atIndex:):

上面樣例調用以後将會在數組的最前面也就是下标為0增加元素"Maple Syrup"。

類似的。你能夠使用removeAtIndex方法來移除數組中的元素。這種方法移除指定的元素,而且傳回被移除的元素(盡管你能夠忽略這個傳回的元素,可是他還是會傳回):

數組中不論什麼元素被移除後空隙都會被填充,是以上面樣例移除第0個以後,第0個立即就會被"Six eggs"替換:

假設你像移除數組中最後一個元素,使用removeLast方法而不是removeAtIndex方法。這樣能夠不用再使用count屬性。和removeAtIndex方法一樣,removeLast也傳回被移除的元素:

周遊數組

你能夠是用for-in循環來周遊數組中的元素

假設你又想擷取元素的值又想擷取元素的下标,那就使用全局函數enumerate來周遊數組。enumerate函數為每個元素傳回一個包括了下标和元素值的元組。你能夠解析元素指派給暫時常亮或者變量作為周遊的一部分:

建立和初始化數組

你能夠使用初始化文法來建立特定類型的空數組(不設定不論什麼初始值)。

注意數組someInts的類型被是Int[],由于他被設定為Int[]初始化的結果。

或者假設上下文中已經說明了類型資訊,比方函數參數或者一個已經定義過類型的變量或常量,那你就能夠使用空得數組字面量[]還建立空數組。

Swfit的數組類型還提供一個初始化器來建立特定長度,各個元素都被指定為預設值的數組。

你須要傳遞給初始化器須要加入的元素數量和一個初始值:

由于有類型判斷。是以在使用這個初始化器的時候是不須要指定數組類型的。由于數組類型從預設值能夠判斷出來:

最後。你能夠通過兩個現有的類型比對的數組相加來建立新的數組。新數組的類型将從相加的兩個數組中判斷出來:

2.字典

字典是一個能夠存儲同一類型的多個值的容器。各個值跟一個唯一的key關聯。key在字典中是值的唯一辨別。

跟數組中的元素不同的是,字典中的元素沒有特定的順序。當你須要使用元素的辨別來查找的時候能夠使用字典,在現實世界中我們使用字典依據單詞來查找定義。

Swift字典也是明白知道自己能夠存儲的key可value的類型。字典和OC的NSDictionary以及NSMutableDictionary不同,NSDictionary和NSMutableDictionary能夠使用不論什麼對象作為key和value。并且不須要提供這些對象的不論什麼類型資訊。在Swift中。一個特定的字典能夠存儲的key和value的類型總是要指明的,要麼通過類型标注,要麼通過類型判斷。

Swift的字典類型寫作Dictionary<KeyType, ValueType>。KeyType是能夠用作字典Key的類型。ValueType是字典能夠存儲的value的類型。

唯一的限制是KeyType必須是hashable,也就是說他必需要提供一個另自己唯一表示的方式。Swift的全部基礎類型(比方String,Int,Double和Bool)預設都是hashable。是以這些類型都能夠作為字典的key。

沒有關聯值的枚舉成員預設也是hashable

字典字面值

你能夠使用字典字面值來初始化字典。字典字面值跟前面的數組字面值文法類似。字典字面值是将一個或多個key-value對寫成字典集合的簡便方式。

一個key-value對是一個key與一個value的綁定。

在字典字面值中,各個key-value用逗号隔開并被中括号包圍,key與value用冒号隔開:

[key 1: value 1, key 2: value 2, key 3: value 3]

以下樣例建立了一個字典來存儲國際機場的名稱:

var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]

字典airport被聲明為Dictionary<String, String>類型。意思是”key類型為String,value類型也為String的字典“

NOTE 字典airports被聲明為變量而不是常量,由于後面樣例中還會向當中加入很多其它元素。

字典airports被使用包括兩個key-value對的字典字面值初始化。

第一對key是”TYO",value是”Tokyo“。第二對key是"DUB"。value是”Dublin“。

這個字典字面值包括兩個字元串:字元串對。正好比對變量airports聲明的類型,是以使用字典字面值指派被同意用來初始化字典airports。

也數組一樣,假設你使用key和value保持一緻的字典字面值來初始化字典的時候也不必要再寫出字典的類型。airports的初始化能夠使用以下的簡寫方式:

var airports = ["TYO": "Tokyo", "DUB": "Dublin"]

由于字典字面值中各個元素的key類型是一樣的,各個元素的value類型也是一樣的,是以swift能夠判斷出來Dictionary<String, String>就是用來初始化字典airport的正确類型。

擷取和改動字典

你能夠通過字典的屬性或者方法或者下智語法來擷取和改動字典。和數組一樣,你能夠使用count屬性來檢視字典中的元素個數。

你能夠使用下智語法想字典中加入新元素。使用新的Key作為下标值,而且使用心得value來指派:

你也能夠使用下智語法來改動特定Key關聯的值:

還能夠使用字典的updateValue(forKey:)方法來設定或者更新特定key相應的值。想上面的下标樣例一樣。假設相應的value不存在,就加入一條記錄,假設存在就更新記錄。隻是和下智語法不一樣的是,updateValue(forKey:)方法傳回的是舊的值。這樣你能夠檢查更新有沒有生效。

updateValue(forKey:)方法傳回字典value類型的可選值。比方上面存儲字元串值的字典,該方法傳回字元串可選值。假設更新前value存在,傳回的可選值其中存儲原來的value,假設不存在,傳回的就是nil。

你也能夠使用下智語法來查詢子字典中特定key相應的值。由于同意使用不存在的key。是以使用字典下标傳回的時一個可選值。

假設字典包括key所相應的value,傳回的就是這個value,假設不包括。傳回的就是nil。

你能夠使用下智語法給特定key的值指派為nil來從字典中删除這個元素。

或者還能夠使用removeValueForKey方法來移除元素。

假設存在元素,就移除然後傳回該元素。假設不存在就直接傳回nil。

周遊字典

你能夠使用for-in循環來周遊字典。字典哥哥元素傳回一個(key, value)的元組,你能夠解析元組成員到暫時變量或者常量中:

你還能夠通過字典的額keys屬性和values屬性來擷取字典的key集合或者value集合:

假設你須要通過一個數組執行個體來使用字典的keys或者values,就用屬性keys或者values來初始化數組:

NOTE Swift的字典是無序集合。當周遊字典的時候。字典中keys,values以及key-value對的擷取順序都是不固定的。

建立空字典

和數組一樣,你能夠使用初始化文法來建立特定類型的空字典:

這個樣例建立了Int,String類型的字典來儲存整數的名稱。key的類型是Int。value的類型是String。

假設上下文已經提供了類型資訊。就能夠直接使用空字典字面值來建立空字典,空字典字面值寫作[:]:

NOTE Swift的數組和字典類型是泛型集合的實作。很多其它泛型和集合資訊請查閱泛型。

3.可改動集合

數組和字典将多個元素存儲到一個集合中。假設你建立了一個數組或者字典,而且指派給一個變量,那麼建立的集合就是能夠改動的。也就是說你能夠在集合建立以後加入很多其它地元素或者移除已有元素來改變集合的長度。反過來假設你把數組或者字典指派給常量。那麼這個數組或者字典就是不可變得。長度也不能改變。

對于字典來說,不可變星還以為這你不恩給你替換已有的key相應的value。不可變的字典内容一旦被設定就不能再改變。

對于數組來說不可變性有一點點不同。

你還是不能做一些可能改變數組唱的的操作,可是你能夠替換數組中已有的值。這樣能夠讓Swift的數組在固定長度的時候提供更好地性能。

NOTE 當集合長度不須要改變的時候盡量要建立不可變的集合。

這樣Swift編譯器能夠優化你建立的集合的性能。

下一篇: 移動app