Swift 程式語言 — 集合類型(1) — 基本概念 & Array

讓我們來認識一下集合類型基本概念以及集合類型中的有序集合類型 — Arrays。

Jeremy Xue
7 min readDec 4, 2018

前言:

在 Swift 中有三個強大的集合類型(Collection Type),分別是 ArraySet 以及 Dictionary,其中每個類型的特性都不太相同,但是他們各自都有各自強大的地方以及優點,這篇教學就帶大家來探索一下三種集合類型的特性。

⎮ 關於集合類型

Swift 提供了三種主要的集合類型,用來存儲值的集合。其中 Array 是有序的值集合,Set 是唯一值的無序集合,Dictionarykey-value 關聯的集合。

三種集合類型的示意圖

在 Swift 中 ArraySet 以及 Dictionary 總是清楚他們可以儲存的值和 key 的類型,這意味著你無法錯誤的將錯誤類型的值插入到集合中。

● 集合的可變性

如果你創建 ArraySet 或是 Dictionary 並且將它賦給變數,那麼這個被創建的集合是可變的。這表示著你可以透過新增、刪除、修改集合中的項目。如果將 ArraySet 或是 Dictionary 賦給常數,那麼該集合內容是無法變動的。

在集合不需要變更的情況下,最好創建無法變動的集合。這樣做能夠使你更容易去理解你的程式碼,並且使 Swift 編譯器能夠優化期性能。

⎮ Arrays

Array 在有順序的清單中儲存相同類型的值,相同的值可以在 Array 中出現在不同的位置。

● 創建一個空的 Array

你可以透過以下三種方式創建一個空的 Array,但是最推薦使用第一種簡寫方式:

// someInts 其元素類型為 Int,類型為[Int]
let someInts = [Int]()
// someDoubles 其元素類型為 Double,類型為[Double]
let someDoubles: [Double] = []
// someStrings 其元素類型為 String,類型為[String]
let someStrings: Array<String> = []
// someFloats 其元素類型為 Float,類型為[Float]
let someFloats = Array<Float>()

你可以在創建可變的 Array 後,透過賦予一個 [] 空的 Array,使其變成空的 Array

給 someInts [] 做為一個空的 Array

請注意!空的 Array 其類型依然跟創建時相同,不會改變。

空的 Array 依然保有其類型

我們可以透過 Array 中的 count 屬性來查看 Array 中包含幾個元素:

透過 count 屬性查看 Array 元素數量

我們還可以使用 Array 中的 isEmpty 屬性來查看是否為空的 Array

使用 isEmpty 查看是否為空的 Array

● 創建帶有默認值的 Array

你也能在一開始提供默認值來創建 Array ,如同前面所說的 Swift 會藉由類型推斷來判斷它的類型。

// 類型為 [Int]
let someInts = [1, 2, 3, 4, 5]
// 類型為 [String]
let someStrings = ["aaa", "bbb", "ccc"]

你還能使用 Array 中的初始化方法 (repeating:, count:) 來產生重複的元素的 Array

使用 Array 初始化方法,產生一個重複 3 次 “Hello” 的 Array

● 連接不同的 Array

你可以透過加號 + 來將兩個相同類型的數組相加來創建新的 Array。新的 Array 的類型將會從兩個結合後的 Array 的類型推斷出來。

將兩個相同類型的 Array 結合成一個 Array

● 訪問以及修改 Array

  • 訪問 Array 中元素:

因為 Array 是一組有順序的集合類型,所以我們可以透過索引(index)來在 Array 中找出它,記得所有索引都是從 0 開始的。假設我們今天有一個購物清單的 Array

var shoppingList = ["牛奶", "麵包", "吐司"]

那我們就能透過其在 Array 中的位置來找出它:

印出 shoppingList[index] 的元素

當我們訪問超過 Array 的範圍時,Swift 編譯器會告訴你該索引超出範圍,顯示 Fatal error: Index out of range ,在一個 Array 中最大可訪問的索引是該 Array.count — 1 或是 endIndex — 1

我們可以透過輸入一個範圍,來訪問多個對象,例如:下方我們使用的 0…shoppingList.count 的意思就是訪問從「0 ~ shoppingList 總數的前一個 index」的意思:

訪問 index 0 ~ shoppingList 總數量-1 的範圍

你也能透過這種方式來修改 Array 中該索引的值:

將 shoppingList[index] 中的值改變

我們也能夠像上面一樣,同時修改一個範圍內的值:

將 shoppingList[0…1] 中的值變更
  • 新增 Array 元素:

Array 中我們可以使用 append 來將一個符合該 Array 類型的元素加到 Array 的最後面:

在 shoppingList 最後加入一個元素
  • 插入 Array 元素:

Array 中我們可以使用 insert(,at:) 來將一個符合該 Array 類型的元素插入到 Array 中的索引位置:

在 shoppingList 的 index 中插入一個元素
  • 刪除 Array 元素:

Array 中我們可以使用 remove(at:) 來刪除 Array 中該索引的元素:

刪除 shoppingList 的 index 元素

我們也可以透過 removeFirst() 刪除 Array 中第一個元素,使用 removeLast() 來刪除最後一個元素。

刪除最前面與最後面的元素後,剩下中間的元素
  • 遍歷 Array 元素

我們可以使用 for-in 迴圈來遍歷整個 Array 中的元素:

如果你需要每個 Array 中的索引以及其值,請使用 enumerated() 方法迭代 Array。對於 Array 中的每個項目,enumerated() 方法來返回由整數和項目組成的元組。這時你就會發現你可以從項目中找到 offect 以及 element 兩種屬性:

當然我們也能使用一個透過元組一個元組,來將它賦予在不同的內容上:

後記:

那麼本次的教學就到這邊結束了,下面一篇文章我們會來介紹剩下的兩種無序的集合類型 Set 以及 Dictionary。希望透過這篇文章各位了解到 Array 的概念,以及如何對它的內容進行操作,當然可能還有我沒有介紹到的屬性或是方法,就等著各位去了解了 😏

--

--

Jeremy Xue

Hi, I’m Jeremy. [好想工作室 — iOS Developer]