close

Swift 提供三個主要的集合型態,arrays, sets, and dictionaries。Array是有順序的收集值。Sets是無順序的收集特別的值。Dictionaries是收集無順序的key-value 關聯值。

 

這三個型態的值不能互相存取,亦即我們可以很放心的從其中一種型態拿同類型的值出來,如dictionary裡面一定是一組一組的key-value關聯。

 

跟字串一樣,若我們需要一個可變動的集合,用變數宣告即可;反之則用常數宣告。

 

Array

陣列是有存放相同型態的一個有順序的列表。我們可以在一個陣列裡隨時存取相同型態的值。

陣列的宣告在Swift的全名是Array<T>,其中T是指我們要放哪種型態的值在這個陣列裡。因為名字很長很難記(?)所以Swift又提供了一個簡寫[T]。而且Swift也建議開發者用這個速記的寫法。

 

var myArray1 = Array<Int>()  // 宣告一個空的陣列,裡面的值為整數

var myArray2 = [Int]()           // 也是宣告一個空的陣列,裡面的值為整數

myArray1.append(2)              //加上一個新的元素,記得型態是依照一開始宣告時所設定好的。

myArray1 = []

 

我們最後給了myArray1一個空的值, 那麼myArray1就沒有東西了;但值的型態依然是Int,清空了也是一樣。

那如果一開始就給空的呢?

var myArray = []

我們會發現,myArray的型態變成NSArray了。這是以前Objective-C的陣列型態,而且是"不可變的"(我們的宣告是var)。因此宣告一個陣列時千萬記得要設定值的型態,不然我們會連改變(加/減值到陣列裡)都會有問題喔。

 

Swift的陣列型態還提供了一個方便的初始化,可以設定陣列是某個數量的某個重覆的值,如:

var weightArray = [Double](count:3, repeatedValue:60.0)

// 初始化一個放了三個人體重的陣列,並且一開始都以60公斤為基準。 

// 等同於 var weightArray = [60.0, 60.0, 60.0]

 

Swift的陣列還可以將兩個陣列加在一起變成新的陣列:

var myArray1 = [1, 1, 1]

var myArray2 = [2, 2, 2]

var myArray = myArray1 + myArray2

// myArray = [1, 1, 1, 2, 2, 2]

當然,myArray1跟myArray2裡面值的型態必需相同的才能加。

 

Accessing and Modifing an Array

我們有一些內建的方法可以用來存取陣列:

print(myArray.count)  // 取得目前陣列內的數量

 

if myArray.isEmpty {

    // 判斷陣列是否有值(即數量為零)

    print("This arrya is empty")

}

 

myArray.append(3)    

// 在陣列最後加一個新的值

// myArray = [1, 1, 1, 2, 2, 2, 3]

 

跟字串一樣,我們也可以用+=來串連陣列;若能跟字串串接起來的就是字串,那麼陣列也是由陣列串接起來:

myArray += [4, 4]

// myArray = [1, 1, 1, 2, 2, 2, 3, 4, 4]

 

若我們知道陣列的索引值,便可利用索引值來存取:

var firstInt = myArray[0]    // firstInt = 1

myArray[0] = 9

// myArray = [9, 1, 1, 2, 2, 2, 3, 4, 4]

 

我們甚至可以將陣列某範圍的值取代掉,如:

myArray[3...7] = [0, 0]

// myArray = [9, 1, 1, 0, 0, 4]

 

myArray[3...4] = [8, 8, 8, 8, 8]

// myArray = [9, 1, 1, 8, 8, 8, 8, 8, 4]

 

也可在某個索引插入新的值:

myArray.insert(3, atIndex:2)

// myArray = [9, 1, 3, 1, 8, 8, 8, 8, 8, 4]

 

跟插入類似,我們也可以移除:

myArray.removeAtIndex(0)

// myArray = [1, 3, 1, 8, 8, 8, 8, 8, 4]

 

在使用索引時,我們要避免用到非範圍內的索引值,如上例的myArra.removeAtIndex(9) 就會出問題了。

若是我們要移除最後一個時,我們可以用removeLast(),也可用索引來處理;不過Swift建議用removeLast()來避免超出索引的問題產生;除此之外,removeLast()也會回傳最後的值,可以多加利用。

 

Iterating Over an Array

我們可以利用for-in迴圈將陣列的值取出:

for myInt in myArray {

    print(myInt)

}

 

若我們需要取得陣列索引及相對應的值,可利用enumerate();他會回傳一組tuple分別為索引以及值:

for (index, value) in myArray.enumerate() {

    print("index \(index) has value \(value)")

}

 

arrow
arrow
    全站熱搜

    Eason 發表在 痞客邦 留言(0) 人氣()