Swift
語言提供Arrays
、 Sets
和 Dictionaries
三種基本的 集合類型用來存儲集合數(shù)據(jù)写半。數(shù)組(Arrays)
是有序
數(shù)據(jù)的 集。 集合(Sets)
是無序無重復(fù)數(shù)據(jù)的集 兜蠕。字典(Dictionaries)
是無序的鍵值對的集 莱预。
Swift
語言中的Arrays
、 Sets
和 Dictionaries
中存儲的數(shù)據(jù)值類型必須明確涨颜。這意味著我們不能把不正確的數(shù) 據(jù)類型插入其中费韭。同時這也說明我們完全可以對取回值的類型非常自信。
集合的可變性
如果創(chuàng)建一個Arrays
庭瑰、 Sets
或Dictionaries
并且把它分配成一個變量星持,這個 集合將會是可變的。這意味著我們 可以在創(chuàng)建之后添加更多或移除已存在的數(shù)據(jù)項弹灭,或者改變 集合中的數(shù)據(jù)項督暂。如果我們把Arrays
揪垄、 Sets
或 Dictionaries
分配成常量,那么它就是不可變的逻翁,它的大小和內(nèi)容都不能被改變饥努。
數(shù)組(Arrays)
數(shù)組使用有序列表存儲同一類型的多個值。相同的值可以多次出現(xiàn)在一個數(shù)組的不同位置中卢未。
注意: Swift 的 Array 類型被橋接到 Foundation 中的 NSArray 類肪凛。
數(shù)組的簡單語法
寫Swift
數(shù)組應(yīng)該遵循像 Array<Element>
這樣的形式堰汉,其中 Element
是這個數(shù)組中唯一允許存在的數(shù)據(jù)類 型辽社。我們也可以使用像 [Element]
這樣的簡單語法。盡管兩種形式在功能上是一樣的翘鸭,但是推薦較短的那種滴铅,而 且在本文中都會使用這種形式來使用數(shù)組。
創(chuàng)建一個空數(shù)組
我們可以使用構(gòu)造語法來創(chuàng)建一個由特定數(shù)據(jù)類型構(gòu)成的空數(shù)組:
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// 打印 "someInts is of type [Int] with 0 items."
或者就乓,如果代碼上下文中已經(jīng)提供了類型信息汉匙,例如一個函數(shù)參數(shù)或者一個已經(jīng)定義好類型的常量或者變量,我 們可以使用空數(shù)組語句創(chuàng)建一個空數(shù)組生蚁,它的寫法很簡單: [] (一對空方括號):
someInts.append(3)
// someInts 現(xiàn)在包含一個 Int 值
someInts = []
// someInts 現(xiàn)在是空數(shù)組噩翠,但是仍然是 [Int] 類型的。
創(chuàng)建一個帶有默認(rèn)值的數(shù)組
Swift
中的 Array
類型還提供一個可以創(chuàng)建特定大小并且所有數(shù)據(jù)都被默認(rèn)的構(gòu)造方法邦投。我們可以把準(zhǔn)備加入新 數(shù)組的數(shù)據(jù)項數(shù)量( count
)和適當(dāng)類型的初始值( repeating
)傳入數(shù)組構(gòu)造函數(shù):
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles 是一種 [Double] 數(shù)組伤锚,等價于 [0.0, 0.0, 0.0]
通過兩個數(shù)組相加創(chuàng)建一個數(shù)組
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles 被推斷為 [Double],等價于 [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles 被推斷為 [Double]志衣,等價于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
用數(shù)組字面量構(gòu)造數(shù)組
我們可以使用數(shù)組字面量來進(jìn)行數(shù)組構(gòu)造屯援,這是一種用一個或者多個數(shù)值構(gòu)造數(shù)組的簡單方法轧铁。數(shù)組字面量是一
系列由逗號分割并由方括號包含的數(shù)值:
[value 1, value 2, value 3] 鲸沮。
下面這個例子創(chuàng)建了一個叫做shoppingList
并且存儲String
的數(shù)組:
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList 已經(jīng)被構(gòu)造并且擁有兩個初始項。
shoppingList
變量被聲明為“字符串值類型的數(shù)組“榆综,記作 [String]
绿店。 因為這個數(shù)組被規(guī)定只有String
一種 數(shù)據(jù)結(jié)構(gòu)吉懊,所以只有String
類型可以在其中被存取。 在這里假勿, shoppingList
數(shù)組由兩個 String
值( "Eggs"
和 "Milk"
)構(gòu)造惕它,并且由數(shù)組字面量定義。
注意: shoppingList 數(shù)組被聲明為變量( var 關(guān)鍵字創(chuàng)建)而不是常量( let 創(chuàng)建)是因為以后可能會有更多的數(shù)據(jù) 項被插入其中废登。
在這個例子中淹魄,字面量僅僅包含兩個 String
值。匹配了該數(shù)組的變量聲明(只能包含String
的數(shù)組)堡距,所以這 個字面量的分配過程可以作為用兩個初始項來構(gòu)造 shoppingList
的一種方式甲锡。
由于Swift
的類型推斷機制兆蕉,當(dāng)我們用字面量構(gòu)造只擁有相同類型值數(shù)組的時候,我們不必把數(shù)組的類型定義清 楚缤沦。 shoppingList
的構(gòu)造也可以這樣寫:
var shoppingList = ["Eggs", "Milk"]
因為所有數(shù)組字面量中的值都是相同的類型虎韵,Swift
可以推斷出 [String]
是shoppingList
中變量的正確類型。
訪問和修改數(shù)組
我們可以通過數(shù)組的方法和屬性來訪問和修改數(shù)組缸废,或者使用下標(biāo)語法包蓝。
可以使用數(shù)組的只讀屬性 count 來獲取數(shù)組中的數(shù)據(jù)項數(shù)量:
print("The shopping list contains \(shoppingList.count) items.")
// 輸出 "The shopping list contains 2 items."(這個數(shù)組有2個項)
使用布爾屬性isEmpty
作為一個縮寫形式去檢查 count 屬性是否為 0
:
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// 打印 "The shopping list is not empty."(shoppinglist 不是空的)
也可以使用 append(_:)
方法在數(shù)組后面添加新的數(shù)據(jù)項:
shoppingList.append("Flour")
// shoppingList 現(xiàn)在有3個數(shù)據(jù)項,有人在攤煎餅
除此之外企量,使用加法賦值運算符( +=
)也可以直接在數(shù)組后面添加一個或多個擁有相同類型的數(shù)據(jù)項:
shoppingList += ["Baking Powder"]
// shoppingList 現(xiàn)在有四項了
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList 現(xiàn)在有七項了
可以直接使用下標(biāo)語法來獲取數(shù)組中的數(shù)據(jù)項测萎,把我們需要的數(shù)據(jù)項的索引值放在直接放在數(shù)組名稱的方括號
中:
var firstItem = shoppingList[0] // 第一項是 "Eggs"
我們也可以用下標(biāo)來改變某個已有索引值對應(yīng)的數(shù)據(jù)值:
shoppingList[0] = "Six eggs"
// 其中的第一項現(xiàn)在是 "Six eggs" 而不是 "Eggs"
還可以利用下標(biāo)來一次改變一系列數(shù)據(jù)值,即使新數(shù)據(jù)和原有數(shù)據(jù)的數(shù)量是不一樣的届巩。下面的例子把 "Chocolate Spread" 硅瞧, "Cheese" ,和 "Butter" 替換為 "Bananas" 和 "Apples" :
只能說Swift的語法真的很簡潔恕汇。
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList 現(xiàn)在有6項
調(diào)用數(shù)組的 insert(_:at:)
方法來在某個具體索引值之前添加數(shù)據(jù)項:
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList 現(xiàn)在有7項
// "Maple Syrup" 現(xiàn)在是這個列表中的第一項
這次insert(_:at:)
方法調(diào)用把值為 "Maple Syrup"
的新數(shù)據(jù)項插入列表的最開始位置腕唧,并且使用0
作為索引 值。
類似的我們可以使用 remove(at:)
方法來移除數(shù)組中的某一項瘾英。這個方法把數(shù)組在特定索引值中存儲的數(shù)據(jù)項移 除并且返回這個被移除的數(shù)據(jù)項(我們不需要的時候就可以無視它):
let mapleSyrup = remove(at: 0)
// 索引值為0的數(shù)據(jù)項被移除
// shoppingList 現(xiàn)在只有6項枣接,而且不包括 Maple Syrup
// mapleSyrup 常量的值等于被移除數(shù)據(jù)項的值 "Maple Syrup"
注意: 如果我們試著對索引越界的數(shù)據(jù)進(jìn)行檢索或者設(shè)置新值的操作,會引發(fā)一個運行期錯誤缺谴。我們可以使用索引值和 數(shù)組的 count 屬性進(jìn)行比較來在使用某個索引之前先檢驗是否有效但惶。除了當(dāng) count 等于 0 時(說明這是個空數(shù) 組),最大索引值一直是 count - 1 瓣赂,因為數(shù)組都是零起索引榆骚。
如果我們只想把數(shù)組中的最后一項移除,可以使用 removeLast()
方法而不是 remove(at:)
方法來避免我們需要獲 取數(shù)組的 count
屬性煌集。就像后者一樣妓肢,前者也會返回被移除的數(shù)據(jù)項:
let apples = shoppingList.removeLast()
// 數(shù)組的最后一項被移除了
// shoppingList 現(xiàn)在只有5項,不包括 Apples // apples 常量的值現(xiàn)在等于 "Apples" 字符串```
數(shù)組的遍歷
我們可以使用for-in
循環(huán)來遍歷所有數(shù)組中的數(shù)據(jù)項:
for item in shoppingList {
print(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas
如果我們同時需要每個數(shù)據(jù)項的值和索引值苫纤,可以使用 enumerated()
方法來進(jìn)行數(shù)組遍歷碉钠。 enumerated()
返回 一個由每一個數(shù)據(jù)項索引值和數(shù)據(jù)值組成的元組。我們可以把這個元組分解成臨時常量或者變量來進(jìn)行遍歷:
for (index, value) in shoppingList. enumerated() {
print("Item \(String(index + 1)): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas