iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 7
0
Software Development

Swift 菜鳥的30天系列 第 7

Day-07 Swift 語法(3) - 集合類型

集合的類型介紹


Swift提供了三種主要的集合類型,有 Array 、 Set 還有 Dictionary,用來作為儲存值的集合。

https://ithelp.ithome.com.tw/upload/images/20171225/20107701hvUmR6CC9c.png

集合的可變性

當你使用 var 去宣告 Array , Set 或是 Dictionary 給變數,那麼這個集合就是可變的,這代表你可以對這個集合進行新增、刪除、修改。但如果你用 let 將集合宣告給一個常數,那麼這個集合的任何大小和內容都無法被修改。


數組 (Array)

數組以有序的方式來儲存相同類型的值。相同類型的值可以在數組的不同地方多次出現。

創建數組

https://ithelp.ithome.com.tw/upload/images/20171225/20107701wSOkqrNpun.png

你可以使用確定類型通過初始化器語法來創建一個空數組,並用 count 查看數組中的數量。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701QixfvgIyYK.png

數組新增刪除

*切記數組的順序是從 0 開始而不是 1 ,所以數組中的 [0] 為第一個元素。

如果數組是一個變量的話,我們可以利用 append 在數組最後添加相同類型的值。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701kKekcXcniu.png

刪除的話我們可以使用 removeLast 把 array 最後面的值給刪除,也就是剛剛添加的 33。
https://ithelp.ithome.com.tw/upload/images/20171225/201077017vUhUChNi0.png

當然我們也可以為要選擇要插入或刪除的值的序,直接加入或刪除該序的值的位置。使用 insert 方法插入和使用 remove 方法刪除,這兩者都必須輸入要執行的順序位置。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701hQW6cpVhdg.png

清空數組

清空數組的方式可以使用 removeAll() 的方式清除,或是將 array 轉成一個空數組。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701m1nBysKTCU.png
https://ithelp.ithome.com.tw/upload/images/20171225/20107701jtDtLBP7En.png

使用默認值創建數組

我們使用 Array(repeating: 數字 , count: 重複次數) 來實行這個方式實行他。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701Evh4GrPyFT.png

將兩個數組合成為一個數組

在這個例子中,我想把有 1, 2, 3 的數組 (one2three) 與 4, 5, 6 的數組 (four2six) 合在一起,並且將他們合在一起的數組放到 (one2six) 的數組中。

https://ithelp.ithome.com.tw/upload/images/20171225/20107701YzSAghIkuM.png

使用 String 創建數組

當然你也可以使用字串來創建數組,並且用 count 來查看數組中的數量。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701LjKu2Rfynp.png

我們也可以使用 isEmpty 來快速了解數組內是否有值。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701TZmzqkdOZm.png

字串類型的數組也可以用上述的方式進行新增、刪除,我們也可以使用 ( += ) 符號在數組的最後加上一個或是多個相同類型的元素。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701AB7D7cOGt6.png

查詢及修改數組內容

我們可以藉由 shoppingList[順序],來查看數組中該順序的元素是什麼,並且我們可以將其內容修改。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701HZLDRNaxlO.png

你可以使用下標腳本語法來一次改變一個數組內範圍的值,就算替換與兩者長度不同。下面這個例子是我把[ 炸雞、啤酒、漢堡和薯條 ]換成用[ 麥當勞 和 肯德基 ]代替。
https://ithelp.ithome.com.tw/upload/images/20171225/20107701t2usO8vCBt.png

遍歷(Iterating Over)一個數組

你可以用 for - in 方式來查看一個數組中全部項目

https://ithelp.ithome.com.tw/upload/images/20171225/20107701f3VXETzCjw.png

如果你需要每個項目的值以及值的序,可以使用 enumerated ( )方法來查看數組

https://ithelp.ithome.com.tw/upload/images/20171226/201077010zvVlDeR9z.png


合集 (Set)

創建一個空合集

合集將同一類型且不重複的值無序地儲存在一個集合當中。當元素的順序不那麼重要的時候你就可以使用合集來代替數組,或者你需要確保元素不會重複的時候。

Set類型的 HashValue

為了能讓類型儲存在合集當中,它必須是 hashable 的——就是說類型必須提供計算它自身 hashValue 的方法。hashValue 是Int值且所有的對比起來相等的對像都相同,比如 a == b ,它遵循 a . hashValue == b . hashValue 。

所有 Swift 的基礎類型(比如 String , Int , Double ,和 Bool)默認都是 hashable 的,並且可以用於合集或者字典的鍵。沒有關聯值的枚舉成員值同樣默認 hashable。

你可以使用你自己自定義的類型作為合集的值類型或者字典的 key 類型,只要讓它們遵循 Swift 的 Hashable 協議即可。遵循 Hashable 協議的類型必須提供可獲取的叫做 hashValue的 Int屬性。通過 hashValue 屬性返回的值不需要在同一個程序的不同的執行當中都相同,或者不同程序。
因為 Hashable協議遵循 Equatable,遵循的類型必須同時一個“等於”運算符( == )的實現。也就是說, 必須滿足以下三個條件,其中 a , b ,和 c 是任意值:

  1. a == a (Reflexivity 自反性)
  2. a == b 代表 b == a (Symmetry 對稱性)
  3. a == b && b == c 代表 a == c (Transitivity 傳遞性)

創建並初始化一個空合集

你可以使用初始化器語法來創建一個確定類型的空合集
https://ithelp.ithome.com.tw/upload/images/20171226/20107701BKtBeoHyJ8.png

同樣的我們都可以用上述在 Array 中的新增、刪除、插入和修改的功能。
https://ithelp.ithome.com.tw/upload/images/20171226/20107701YoHioZNLqm.png

使用 String 創建合集

想當然的也能使用 String 創建合集,Swift 也能幫我們判斷 game2 是 String 類型,所以我們也不用特地去說明他的類型,同時,我們也能使用 hasValue 來判斷這兩個 set 內容是否相同。
https://ithelp.ithome.com.tw/upload/images/20171226/20107701TRIoZtOw2V.png

查詢及修改合集

insert , remove 的方式都與 Array 大同小異,在這邊我們簡單舉例一個例子,這段程式碼會判斷你刪去了什麼食物,並 print 出你剛剛刪除了什麼,如果這個值不存在,則返回"我沒有買那樣食物"。

https://ithelp.ithome.com.tw/upload/images/20171226/20107701ULoRtPhyOK.png

下列這個例子則是使用 contains 來判斷合集中是否擁有該元素,他得出的值是 Bool 值,也就是 true 或 false ,如果這結果是為 true 則列出我有買炸雞, false 則是相反。
https://ithelp.ithome.com.tw/upload/images/20171226/201077016nLFulbnxG.png

遍歷合集

你同樣的可以使用 for in 語法來遍歷合集,查看裡頭的元素。同時,你也可以使用 sorted() 來使他們排序。
https://ithelp.ithome.com.tw/upload/images/20171226/20107701o7Z5dboXB4.png


兩個合集間操作

求兩者合集特定值

下邊的圖描述了 a 和 b 兩個合集在各種合集操作下的結果,用綠色部分表示兩者所包含的區域。
https://ithelp.ithome.com.tw/upload/images/20171226/20107701WdndY22NWH.png

  • 使用 intersection 方法來創建一個只包含兩者共有值的合集。
  • 使用 symmetricDifference 方法來創建一個只包含除了兩者共有值外的兩個合集的各有值。
  • 使用 union 方法來創建一個包含兩者所有值的合集。
  • 使用 subtracting 方法來創建一個兩者當中不包含某個合集值的合集。

https://ithelp.ithome.com.tw/upload/images/20171226/201077018SwCCWOJ2k.png

求合集關係和相關性

下圖中有 a, b, c 三個合集,重疊區域則代表有共有的值, a 是 b 的超集,所以 a 包含了 b 的所有值。反句話說 b 是 a 的子集,所以 b 的所有值都被 a 給包含,然後 b 和 c 不相交,所以他們沒有共有值。

https://ithelp.ithome.com.tw/upload/images/20171226/20107701ZSlUEsUGOM.png

  • 使用( == )運算符來判斷兩個合集是否包含有相同的值。
  • 使用 isSubset 方法來確定一個合集是否被某合集包含。
  • 使用 isSuperset 方法來確定一個合集是否包含某個合集。
  • 使用 isDisjoint 方法來判斷兩個合集是否沒有交集的值。
  • 使用 isStrictSubset 或者 isStrictSuperset 方法來確定某個合集是否為某一個合集的子集或者超集,但兩者並不相等。

https://ithelp.ithome.com.tw/upload/images/20171226/201077010yRrjRhBra.png


字典 (Dictionary)

字典儲存無序的互相關聯的同一類型的鍵(key)和同一類型的值的集合。每一個值都與唯一的鍵相關聯。不同於數組中的元素,字典中的元素沒有特定的順序。當你需要尋找特定標記的值的時候就可以使用字典這個方式。

創建一個空字典

如前面兩者的創建方式相同,只是字典多了一個鍵值可以使用,鍵值與後面的值可以是不同類型。
https://ithelp.ithome.com.tw/upload/images/20171226/20107701NUnEKv94x1.png

使用 String 創建字典

同樣你也可以使用字串方式創建他的值以及他的鍵值,如果你的值的類型都是 String 字串型別的話,你也不需特別在前面加上 [String:String] 告訴他類型,之後就能使用字串類型的鍵值呼叫。

https://ithelp.ithome.com.tw/upload/images/20171226/20107701tgPIing967.png

訪問和修改字典

這些內容想必大家應該滾瓜爛熟了,只跟前面的內容差在需要多一個「 鍵值 」就能處理,所以我用一張圖來說明。

https://ithelp.ithome.com.tw/upload/images/20171226/20107701cY7YyAjD5G.png

你還可以使用 updateValue 方式來修改原有鍵值中的內容,也能將鍵值中的值設為 nil 。
https://ithelp.ithome.com.tw/upload/images/20171226/20107701U07r1qtEPx.png

遍歷字典

你依然可以使用 for - in 語法來查看字典中的鍵值及內容。

https://ithelp.ithome.com.tw/upload/images/20171226/20107701jYufaRspUD.png


上一篇
Day-06 Swift 語法(2) - 到底有沒有的 Optional 和 nil
下一篇
Day-08 Swift 語法(4) - 到底要跑去哪的 Control Flow
系列文
Swift 菜鳥的30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言