亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談Swift集合類型

2019-11-14 18:04:03
字體:
來源:轉載
供稿:網友

Swift 的集合表現形式由數組和字典組成。它可以完美的存儲任何呢想存儲的東西。

 數組是一個同類型的序列化列表集合,它用來存儲相同類型的不同值。字典也是一個數組,但它的存值方式類似于Map,通過一對一鍵來綁定值,是一組非序列化集合。

 在Swift中,數組和字典的鍵和值都必須明確它的類型。

這意味這數組和字典不會插入一個錯誤的類型的值,以致于出錯。這也意味著當你在數組和字典中取回數值的時候能夠確定它的類型。


Swift 使用確定的集合類型可以保證代碼工作是不會出錯,和讓你在開發階段就能更早的捕獲錯誤。

1、數組
數組是儲存同類型不同值的序列化列表。同樣的值可以在數組的不同位置出現多次。

Swift數組是儲存確定的值,這個Objective-C中的NSArray和NSMutableArray類是有區別的。因為它們是儲存各種的對象,而且并不提供返回任何有關對象的具體信息。在Swift中,無論是確定的聲明,還是隱式的聲明,數組是非常確定它自身是儲存什么樣的類型,而且,它并不一定要求儲存的是類對象。所以Swift數組是類型安全的,因為它一直都確定它自身所能包含的值。

數組的簡略語法
定義數組的完整寫法是Array<SomeType>。其中SomeType是你想要包含的類型。你也可以使用類似于SomeType[]這樣的簡略語法。雖然這兩種方法在功能上是相同的。但是我們更推薦后者,而且它會一直貫穿于本書。

數組實量(Array Literals
你可以用一個數組實量(Array Literals)來初始化一個數組,它是用簡略寫法來創建一個包含一個或多個的值的數組。一個數組實量(Array Literals)是由它包含的值,“,”分隔符 已經包括以上內容的中括號對“[]”組成:

pastedGraphic.png

下面的例子創建一個叫shoppinglist,儲存字符串(String)類型的數組。

pastedGraphic_1.png

shoppinglist變量被定義為字符串(String)類型的數組,寫作String[]。因為這個數組被確定為字符串類型(String),所以它只能儲存字符串(String)類型的值。在這里,用兩個字符串類型的值(”Eggs” and “Milk”)和數組實量(Array Literals)的寫法來初始化shoppingList數組。

注意
shoppingList數組是被定義為一個變量(使用var 標識符)而不是常量(使用let 標識符),所以在下面的例子可以直接添加元素。

在這個例子中,數組實量(Array Literals)只包含兩個字符串類型的值,這符合了shoppingList變量的定義(只能包含字符串(String)類型的數組),所以被分配的數組實量(Array Literals)被允許用兩個字符串類型的值來初始化。

得益于Swift的類型推斷,當你用相同類型的值來初始化時,你可以不寫明類型。初始化shoppingList可以用下面這個方法來代替。

pastedGraphic_2.png

因為數組實量(Array Literals)中所有的值都是同類型的,所以Swift能夠推斷shoppingList的類型為字符串數組(String[])。

讀取和修改數組
你可以通過方法和屬性,或者下標來讀取和修改數組。

通過只讀屬性count來讀取數組的長度;

pastedGraphic_3.png

通過一個返回布爾類型的isEmpty屬性檢查數組的長度是否為0

pastedGraphic_4.png

在數組末尾增加一個元素可以通過append方法

pastedGraphic_5.png

甚至,還可以用(+=)操作符來把一個元素添加到數組末尾

pastedGraphic_6.png

你也可以用(+=)操作符來把一個數組添加到另一個數組的末尾

pastedGraphic_7.png

從數組中取出一個值可以使用下標語法。如果你知道一個元素的索引值,你可以數組名后面的中括號中填寫索引值來獲取這個元素

pastedGraphic_8.png

注意

數組的第一個元素的索引值為0,不為1,Swift的數組總是索引0;

你可以使用下標語法通過索引修改已經存在的值。

pastedGraphic_9.png

你可以使用下標語法一次性改變一系列的值,盡管修改的區域遠遠大于要修改的值。在下面的雷子中, 替換掉 “Chocolate SPRead”, “Cheese”,”Butter”,”Bananas”,”Apples”:

pastedGraphic_10.png

注意,你不能使用下標語法在數組中添加一個元素,如果你嘗試使用下標語法來獲取或者設置一個元素,你將得到一個運行時的錯誤。盡管如此,你可以通過count屬性驗證索引是否正確再使用它。當count為0時(意味著數組為空),則count-1超出了索引的有效范圍,因為數組的索引總是從0開始。

在一個特定的索引位置插入一個值,可以使用insert(atIndex:)方法

pastedGraphic_11.png

這里調用insert方法指明在shoppingList的索引為0的位置中插入一個新元素 “Maple Syrup”

同理,你可以調用removeAtIndex方法移除特定的元素。這個方法移除特定索引位置的元素,已經返回這個被移除的元素(盡管你并不關心這個返回值)。

pastedGraphic_12.png

當元素被移除的,數組空缺的位置將會被填補,所以現在索引位置為0的元素再一次等于”Six eggs”:

pastedGraphic_13.png

如果你從數組中移除最后一個元素,使用removeLast方法比removeAtIndex更方便,因為后者需要通過count屬性計算數組的長度。和removeAtIndex方法一樣,removeLast會返回被移除的元素。

pastedGraphic_14.png

遍歷數組
可以使用for-in循環來遍歷數組中的值

pastedGraphic_15.png

如果需要每一個元素的整形的索引值,使用enumerate函數代替會更方便,enumerate函數對于每一個元素都會返回一個包含元素的索引和值的元組(tuple)。你可以在遍歷部分分解元祖并儲存在臨時變量或者常量中。

pastedGraphic_16.png

 

創建和初始化數組
創建一個空的數組和確定的類型(不包含初始化值)使用的初始化語法:

pastedGraphic_17.png

注意

someInt變量被確定為Int[],因為它使用生成Int[]的初始化方法。

或者,如果上下文(context)已經提供類型信息,例如函數參數或者已經確定類型的常量和變量,你可以從空的數組實量(Array Literals)創建一個空數組,寫作[](空的中括號對)。

pastedGraphic_18.png

Swift數組類型也提供初始化方法來創建確定長度和提供默認數值的數組。你可以通過這個初始化方法增加一個新的數組,元素的數量成為count,合適的默認值為repeatedValue

pastedGraphic_19.png

得益于類型推斷,你并不需要指明這個數組儲存的類型就能使用這個初始化方法,因為它從默認值中就能推斷出來。

pastedGraphic_20.png

最后,你可以使用(+)操作符就能創建一個新的數組,把兩個存在的數組添加進來
這個新的數組類型從你添加的兩個數組中推斷出來

pastedGraphic_21.png

2、字典

字典是儲存同一類型但是不同值的容易。每一個值都對應這一個唯一的鍵(Key),就像是字典內的每一個值都有一個標識符。和數組內的元素是由區別的,字典內的元素是沒有特殊的序列的。當你需要根據標識符來查找批量的值時,就可以使用字典。同樣的,真實
的物品字典常常用來當作查找特定字典的標識符。

Swift字典時儲存一個類型的具體的鍵和值,和Objective-C的NSDictionary 和NSMutableDictionary由一定的區別,因為它們是使用各種的對象來作為它們的鍵和值,而且并不提供任何有關對象的具體信息。在Swift中,對于一個特定的字典,它所能儲存的鍵和值都是確定的,無論是明確聲明的類型還是隱式推斷的類型。

Swift的字典寫法是Dictionary<KeyType,ValueType>,KeyType是你想要儲存的鍵,ValueType是你想要儲存的值。

唯一的限制就是KeyType必須是可哈希的(hashable)——就是提供一個形式讓它們自身是獨立識別的。Swift的所有基礎類型(例如字符串(String),整形(Int),雙精度(Double)和布爾(Bool))在默認是可哈希的(hashable),和這些類型都常常用語當作字典的鍵。枚舉成員值不需要協助值(associated values)(具體描述在 Enumerations)也是因為它們默認也是可哈希的(hashable)。

字典實量(Dictionary Literals
你可以直接用一個字典實量(Dictionary Literals)初始化一個字典。和前面定義一個數組實量(Array Literals)的語法一樣。字典實量(Dictionary Literals)就是使用簡略寫法直接寫一個或者多個的鍵值對來定義一個字典。

一個鍵值對是一個鍵和值的組合。在字典實量(Dictionary Literals)里面,每一個鍵值對總是用一個冒號把鍵和值分割。鍵值對的寫法就想是一個列表,使用逗號分割,并被一對中括號[]包含著:

pastedGraphic_22.png

在下面的例子,將會創建一個字典來儲存國際機場的名字。在這個字典里面,鍵是三個字的國際航空運送協會代碼,以及它的值是機場的名稱:

pastedGraphic_23.png

airport字典被定義為一個類型為Dictionary<String, String>,這意味這,這個字典的鍵類型是字符串String,和它的值的類型也是String。

注意
airport字典是被定義為一個變量(使用var 標識符)而不是常量(使用let 標識符),所以在下面的例子可以直接添加元素。

airport字典使用一個包含兩個鍵值對的字典實量(Dictionary Literals)來初始化。第一對由一個叫“TYO”的鍵和一個叫“Tokyo”的值,第二對有一個叫“DUB”的鍵和一個叫“Dublin”的值。

這個字典實量(Dictionary Literals)包含兩個字符串(String):字符串對。這符合airport變量定義的類型(一個字典只包括字符串(String)鍵和字符串(String)值),所以在分配字典實量(Dictionary Literals)的時候被允許作為airport字典的兩個初始化元素。

和數組一樣,如果你初始化一個字典的時候使用相同的類型,你可以不指明字典的類型。
airport初始化可以用下面這個簡略寫法來代替:

pastedGraphic_24.png

因為所有的鍵在字面上都是相同的類型,同樣,所有的值也是同樣的類型,所以Swift可以推斷為Dictionary<String, String>是airports字典的正確類型。

讀取和修改字典
你可以通過屬性,方法或者下標來讀取和修改字典。和數組一樣,你使用只讀的count屬性來檢查字典(Dictionary)包含多少個元素。

pastedGraphic_25.png

你可以使用下標語法給一個字典添加一個元素。使用合適類型作為新的鍵,并分配給它一個合適的值

pastedGraphic_26.png

你也可以使用下標語法去改變一個特定鍵所關聯的值。

pastedGraphic_27.png

同樣, 使用字典的updateValue(forKey:) 方法去設置或者更新一個特定鍵的值 . 和上面的下標例子一樣, updateValue(forKey:) 方法如果鍵不存在則會設置它的值,如果鍵存在則會更新它的值, 和下標不一樣是, updateValue(forKey:) 方法 如果更新時,會返回原來舊的值rThis enables you to 可以使用這個來判斷是否發生了更新。

pastedGraphic_28.png

你也可以使用下標語法通過特定的鍵去讀取一個值。因為如果他的值不存在的時候,可以返回他的鍵,字典的下標語法會返回一個字典的值的類型的可選值。如果字典中的鍵包含對應的值,這字典下標語法會返回這個鍵所對應的值,否則返回nil

pastedGraphic_29.png

你可以使用下標語法把他的值分配為nil,來移除這個鍵值對。

pastedGraphic_30.png

// APL 已經從字典中被移除
同樣,從一個字典中移除一個鍵值對可以使用removeValueForKey方法,這個方法如果存在鍵所對應的值,則移除一個鍵值對,并返回被移除的值,否則返回nil。

pastedGraphic_31.png

遍歷字典
你可以使用一個for-in循環來遍歷字典的鍵值對。字典中的每一個元素都會返回一個元祖(tuple),你可以在循環部分分解這個元祖,并用臨時變量或者常量來儲存它。

pastedGraphic_32.png

你也可以讀取字典的keys屬性或者values屬性來遍歷這個字典的鍵或值的集合。

pastedGraphic_33.png

如果你需要一個接口來創建一個字典的鍵或者值的數組實例,你可以使用keys或者values屬性來初始化一個數值。

pastedGraphic_34.png

注意
Swift中的字典類型是非序列化集合,如果你需要序列化取回鍵,值,或者鍵值對,遍歷字典不具體敘述。

創建一個空字典
和字典一樣,你可以使用確定類型的語法創建一個空的字典。

pastedGraphic_35.png

這個例子創建一個Int,String類型的字典來儲存可讀性較好的整數值。它的鍵是Int類型,以及它們的值是String類型。
如果 上下文(context )中已經提供類型信息,可用一個字典實量(Dictionary Literal)創建一個空的字典,寫作[;](由一對[]包含一個冒號:)

pastedGraphic_36.png

注意
在這個場景,Swift數組和字典類型是一個內置的集合。

3、可變集合類型

數組和字典都是在一個集合中一起儲存不同的變量.如果你創建一個數組或者字典,再包含一個變量,創建的這個變量被稱為可變的(mutable) 這意味這,你可以在創建之后增加更多的元素來改變這個集合的長度,或者移除已經包含的。 相反的, 如果你把一個數組或者字典定義為常量,則這個數組或者字典不是可變的,他們的長度并不能被改變。
在字典中,不可變也意味著你不能替換已經存在的鍵的值。一個不可變字典,一旦被設置就不能改變。
數組的不可變有一點點的不同。然而,你仍然不能做任何有可能修改不可變數組的行為。但是你可以重新設置一個已經存在的索引,這使得當Swift的數組的長度確定時,能更好地優化數組的性能。
擁有可變行為的數組也影響著數組實例的分配和修改。
注意
在所有的例子中,這是一個好的練習去創建不可變集合,當數組的長度不需要被改變。
我確信Swift編譯器能優化好你所創建的集合。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频一区二区三区…| 亚洲国产另类 国产精品国产免费| 久久91亚洲精品中文字幕| 91精品综合视频| 欧美国产日韩中文字幕在线| 久久亚洲精品国产亚洲老地址| 久久精品国产综合| 国产精品福利在线观看| 92版电视剧仙鹤神针在线观看| 亚洲精品自拍第一页| 国外成人免费在线播放| 亚洲国产日韩欧美在线99| 91极品女神在线| 欧美精品第一页在线播放| 欧美日韩性生活视频| 福利视频第一区| 日韩av成人在线观看| 国产精品网站视频| 久久香蕉频线观| 欧美在线一区二区三区四| 欧美性做爰毛片| 在线不卡国产精品| 亚洲v日韩v综合v精品v| 久久久国产精品免费| 久久久国产精彩视频美女艺术照福利| 成人精品aaaa网站| 亚洲综合在线中文字幕| 欧美日韩成人在线观看| 国产精品免费电影| 久久久久国产精品免费网站| 7m第一福利500精品视频| 精品久久久久久中文字幕| 九九热这里只有精品免费看| 亚洲精品久久久一区二区三区| 在线观看国产成人av片| 91在线免费网站| 欧美亚洲另类制服自拍| 国产91在线播放| 国产精品网址在线| 欧美巨猛xxxx猛交黑人97人| 亚洲国产97在线精品一区| 亚洲精品久久久久久久久| 日韩在线欧美在线国产在线| 日韩精品欧美激情| 精品国产电影一区| 中文字幕欧美亚洲| 中文字幕自拍vr一区二区三区| 91久久精品在线| 色婷婷亚洲mv天堂mv在影片| 成人激情电影一区二区| 精品美女永久免费视频| 免费不卡欧美自拍视频| 欧美亚洲激情在线| 国产精品久久久久久亚洲调教| 国产精品偷伦视频免费观看国产| 国产主播精品在线| 久久精品国产精品亚洲| 国产精品久久久久久久久久久久久久| 欧美国产日韩一区| 国产成+人+综合+亚洲欧洲| 中文字幕一区二区精品| 久久久久久久999精品视频| 色噜噜狠狠狠综合曰曰曰| 欧美电影在线观看网站| 欧美亚洲国产精品| 亚洲男人天堂2023| 国产成人精品视频| 国产欧美日韩精品丝袜高跟鞋| 国产v综合v亚洲欧美久久| 26uuu日韩精品一区二区| 国产一区二区久久精品| 亚洲人高潮女人毛茸茸| 亚洲精品av在线播放| 日本午夜在线亚洲.国产| 精品国产欧美一区二区五十路| 久久精品成人一区二区三区| 九九久久综合网站| 亚洲欧美在线磁力| 亚洲的天堂在线中文字幕| 视频在线观看99| 中文字幕日韩精品有码视频| 欧美国产日本高清在线| 亚洲男人7777| 菠萝蜜影院一区二区免费| 成人免费视频网| 成人xxxxx| 欧美专区中文字幕| 精品夜色国产国偷在线| 欧美激情第6页| 国产999视频| 疯狂蹂躏欧美一区二区精品| 欧美精品久久久久久久免费观看| 亚洲女人天堂av| 中文字幕视频一区二区在线有码| 久久久久久久久综合| 孩xxxx性bbbb欧美| 国产日韩精品综合网站| 久久久久久久999精品视频| 久久久久久久久久久久久久久久久久av| 欧美黑人巨大精品一区二区| 欧美插天视频在线播放| 6080yy精品一区二区三区| 亚洲人av在线影院| 色老头一区二区三区| **欧美日韩vr在线| 欧美成人精品在线| 伊人成人开心激情综合网| 国产一区二区三区在线观看视频| 中文字幕在线日韩| 日韩av一卡二卡| 久久福利视频网| 秋霞成人午夜鲁丝一区二区三区| 国产成人鲁鲁免费视频a| 日韩一区二区三区国产| 国产一区视频在线播放| 国产日韩在线观看av| 欧美亚洲一区在线| 国产精品白嫩初高中害羞小美女| 美女性感视频久久久| 欧美中文在线免费| 欧美激情精品久久久久久变态| 精品福利樱桃av导航| 欧美极品美女视频网站在线观看免费| 51色欧美片视频在线观看| 国产精品美女免费视频| 7m第一福利500精品视频| 91网站在线免费观看| 国产精品高精视频免费| 中文字幕精品影院| 国产丝袜一区二区三区| 成人激情视频小说免费下载| 欧美日韩亚洲精品一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一| 日本成人黄色片| 亚洲香蕉伊综合在人在线视看| 中文字幕久热精品在线视频| 成人国产精品久久久| 国产精品高潮粉嫩av| 国内精品久久久久久影视8| 国产精品九九九| 91精品免费久久久久久久久| 欧美刺激性大交免费视频| 69影院欧美专区视频| 黄色成人在线播放| 一区二区中文字幕| 欧美成人四级hd版| 午夜精品免费视频| 欧美性高跟鞋xxxxhd| 国产第一区电影| 在线视频亚洲欧美| 狠狠躁夜夜躁久久躁别揉| 国产免费一区二区三区在线能观看| 韩国三级电影久久久久久| 爽爽爽爽爽爽爽成人免费观看| 亚洲精品suv精品一区二区| 成人日韩在线电影| 国模gogo一区二区大胆私拍| 亚洲亚裔videos黑人hd| 狠狠久久五月精品中文字幕| 亚洲欧美在线播放| 中文字幕亚洲欧美一区二区三区| 日韩**中文字幕毛片| 久久69精品久久久久久久电影好| 久久天堂电影网|