Swift之集合類型 (Collection Types)(數(shù)組篇)

Swift 語言提供ArraysSetsDictionaries 三種基本的 集合類型用來存儲集合數(shù)據(jù)写半。數(shù)組(Arrays)是有序
數(shù)據(jù)的 集。 集合(Sets)是無序無重復(fù)數(shù)據(jù)的集 兜蠕。字典(Dictionaries)是無序的鍵值對的集 莱预。
Swift 語言中的ArraysSetsDictionaries 中存儲的數(shù)據(jù)值類型必須明確涨颜。這意味著我們不能把不正確的數(shù) 據(jù)類型插入其中费韭。同時這也說明我們完全可以對取回值的類型非常自信。

集合的可變性

如果創(chuàng)建一個Arrays 庭瑰、 SetsDictionaries 并且把它分配成一個變量星持,這個 集合將會是可變的。這意味著我們 可以在創(chuàng)建之后添加更多或移除已存在的數(shù)據(jù)項弹灭,或者改變 集合中的數(shù)據(jù)項督暂。如果我們把Arrays 揪垄、 SetsDictionaries 分配成常量,那么它就是不可變的逻翁,它的大小和內(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卷拘,一起剝皮案震驚了整個濱河市喊废,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栗弟,老刑警劉巖污筷,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乍赫,居然都是意外死亡瓣蛀,警方通過查閱死者的電腦和手機陆蟆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惋增,“玉大人叠殷,你說我怎么就攤上這事≌┟螅” “怎么了林束?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稽亏。 經(jīng)常有香客問我壶冒,道長,這世上最難降的妖魔是什么措左? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任依痊,我火速辦了婚禮避除,結(jié)果婚禮上怎披,老公的妹妹穿的比我還像新娘。我一直安慰自己瓶摆,他們只是感情好凉逛,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著群井,像睡著了一般状飞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上书斜,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天诬辈,我揣著相機與錄音,去河邊找鬼荐吉。 笑死焙糟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的样屠。 我是一名探鬼主播穿撮,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痪欲!你這毒婦竟也來了悦穿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤业踢,失蹤者是張志新(化名)和其女友劉穎栗柒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體知举,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瞬沦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年深员,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛙埂。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倦畅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绣的,到底是詐尸還是另有隱情叠赐,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布屡江,位于F島的核電站芭概,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惩嘉。R本人自食惡果不足惜罢洲,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望文黎。 院中可真熱鬧惹苗,春花似錦、人聲如沸耸峭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳闹。三九已至院究,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間本涕,已是汗流浹背业汰。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菩颖,地道東北人样漆。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像位他,于是被迫代替她去往敵國和親氛濒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容