Swift5.1—數(shù)組(Arrays)

注:Swift的Array類(lèi)型被橋接到Foundation中的NSArray類(lèi)。

數(shù)組的簡(jiǎn)單語(yǔ)法

Swift中數(shù)組的完整寫(xiě)法為Array<Element>,其中Element是這個(gè)數(shù)組中唯一允許存在的數(shù)據(jù)類(lèi)型策吠。也可以使用像[Element]這樣的簡(jiǎn)單語(yǔ)法。盡管兩種形式在功能上是一樣的,但是推薦較短的那種识椰,而且在本文中都會(huì)使用這種形式來(lái)使用數(shù)組。

創(chuàng)建一個(gè)空數(shù)組

你可以使用構(gòu)造語(yǔ)法來(lái)創(chuàng)建一個(gè)由特定數(shù)據(jù)類(lèi)型構(gòu)成的空數(shù)組深碱。

var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
//打印“someInts is of type [Int] with 0 items.”

注意腹鹉,通過(guò)構(gòu)造函數(shù)的類(lèi)型,someInts 的值類(lèi)型被推斷為 [Int]敷硅。

或者功咒,如果代碼上下文中已經(jīng)提供了類(lèi)型信息,例如一個(gè)函數(shù)參數(shù)或者一個(gè)已經(jīng)定義好類(lèi)型的常量或者變量绞蹦,你可以使用空數(shù)組語(yǔ)句創(chuàng)建一個(gè)空數(shù)組力奋,它的寫(xiě)法很簡(jiǎn)單:[](一對(duì)空方括號(hào))。

someInts.append(3)
//someInts現(xiàn)在包含一個(gè)Int值
someInts = [ ]
//someInts現(xiàn)在是空數(shù)組幽七,但是仍然是[Int]類(lèi)型的刊侯。

創(chuàng)建一個(gè)帶有默認(rèn)值的數(shù)組

Swift 中的 Array 類(lèi)型還提供一個(gè)可以創(chuàng)建特定大小并且所有數(shù)據(jù)都被默認(rèn)的構(gòu)造方法★弊撸可以把準(zhǔn)備加入新數(shù)組的數(shù)據(jù)項(xiàng)數(shù)量(count)和適當(dāng)類(lèi)型的初始值(repeating)傳入數(shù)組構(gòu)造函數(shù)滨彻。

var threeDoubles = Array(repeating:0.0,count:3)
//threeDoubles 是一種 [Double] 數(shù)組,等價(jià)于 [0.0, 0.0, 0.0]

通過(guò)兩個(gè)數(shù)組相加創(chuàng)建一個(gè)數(shù)組

你可以使用加法操作符(+)來(lái)組合兩個(gè)已存在的相同類(lèi)型數(shù)組挪蹭。新數(shù)組的數(shù)據(jù)類(lèi)型會(huì)從兩個(gè)數(shù)組的數(shù)據(jù)類(lèi)型中推斷出來(lái)亭饵。

var anotherThreeDoubles = Array(repeating:2.5,count:3)
//anotherThreeDoubles被推斷為[Double],等價(jià)于[2.5,2.5,2.5]

var sixDoubles = threeDoubles + anotherThreeDoubles
//sixDoubles被推斷為[Double]梁厉,等價(jià)于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

用數(shù)組字面量構(gòu)造數(shù)組

你可以使用數(shù)組字面量來(lái)進(jìn)行數(shù)組構(gòu)造辜羊,這是一種用一個(gè)或者多個(gè)數(shù)值構(gòu)造數(shù)組的簡(jiǎn)單方法踏兜。數(shù)組字面量是一系列由逗號(hào)分隔并由方括號(hào)包含的數(shù)值。

[value 1,value 2,value 3]

下面這個(gè)例子創(chuàng)建了一個(gè)叫做shoppingList并且存儲(chǔ)String的數(shù)組八秃。

var shoppingList:[String] = ["Eggs","Milk"]
//shoppingList已經(jīng)被構(gòu)造并且擁有兩個(gè)初始項(xiàng)

shoppingList變量被聲明為“字符串值類(lèi)型的數(shù)組”碱妆,記作[String]。因?yàn)檫@個(gè)數(shù)組被規(guī)定只有String一種數(shù)據(jù)結(jié)構(gòu)昔驱,所以只有String類(lèi)型可以在其中被存取疹尾。在這里,shoppingList 數(shù)組由兩個(gè) String 值("Eggs" 和 "Milk")構(gòu)造骤肛,并且由數(shù)組字面量定義纳本。

注:shoppingList數(shù)組被聲明為變量(var關(guān)鍵字創(chuàng)建)而不是常量(let創(chuàng)建)是因?yàn)橹髸?huì)有更多的數(shù)據(jù)項(xiàng)被插入其中。

在這個(gè)例子中腋颠,字面量?jī)H僅包含兩個(gè)String值繁成。匹配了該數(shù)組的聲明(只能包含String的數(shù)組),所以可以將這個(gè)字面量的賦值過(guò)程看作用兩個(gè)初始項(xiàng)來(lái)構(gòu)造shoppingList的一種方式淑玫。

由于Swift的類(lèi)型推斷機(jī)制巾腕,當(dāng)你用字面量構(gòu)造擁有相同類(lèi)型值數(shù)組的時(shí)候,不必把數(shù)組的類(lèi)型定義清楚絮蒿。shoppingList的構(gòu)造也可以這樣寫(xiě)祠墅。

var shoppingList = ["Eggs","Milk"]

訪(fǎng)問(wèn)和修改數(shù)組

你可以通過(guò)數(shù)組的方法和屬性來(lái)訪(fǎng)問(wèn)和修改數(shù)組,或者使用下標(biāo)語(yǔ)法歌径。

可以使用數(shù)組的只讀屬性count來(lái)獲取數(shù)組中的數(shù)據(jù)項(xiàng)數(shù)量。

print("The shopping list coutains \(shoppingList.count) items.")
//輸出“The shopping list contains 2 items.”(這個(gè)數(shù)組有2個(gè)項(xiàng))

使用布爾屬性isEmpty作為一個(gè)縮寫(xiě)形式去檢查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ù)項(xiàng)回铛。

shoppingList.append("Flour")
//shoppingList現(xiàn)在有3個(gè)數(shù)據(jù)項(xiàng)

除此之外,也可以使用加法賦值運(yùn)算符(+=)直接將另一個(gè)相同類(lèi)型數(shù)組中的數(shù)據(jù)添加到該數(shù)組后面克锣。

shoppingList += ["Baking Powder"]
//shoppingList現(xiàn)在有四項(xiàng)了
shoppingList += ["Chocolate Spread","Cheese","Butter"]
//shoppingList現(xiàn)在有七項(xiàng)了

可以利用下標(biāo)來(lái)一次改變一系列數(shù)據(jù)值茵肃,即使新數(shù)據(jù)和原有數(shù)據(jù)的數(shù)量是不一樣的。下面的例子把"Chocolate Spread"袭祟、"Cheese"和"Butter"替換為"Bananas"和"Apples"验残。

shoppingList[4...6] = ["Bananas","Apples"]
//shoppingList現(xiàn)在有6項(xiàng)

通過(guò)調(diào)用數(shù)組的insert(_:at:)方法在某個(gè)指定索引值之前添加數(shù)據(jù)項(xiàng)。

shoppingList.insert("Maple Syrup",at:0)
//shoppingList現(xiàn)在有7項(xiàng)
//現(xiàn)在這個(gè)列表中的第一項(xiàng)是“Maple Syrup”

類(lèi)似的可以使用remove(at:)方法來(lái)移除數(shù)組中的某一項(xiàng)巾乳。這個(gè)方法把數(shù)組在特定索引值中存儲(chǔ)的數(shù)據(jù)項(xiàng)移除并且返回這個(gè)被移除的數(shù)據(jù)項(xiàng)(不需要的時(shí)候就可以無(wú)視它)您没。

let mapleSyrup = shoppingList.remove(at:0)
//索引值為0的數(shù)據(jù)項(xiàng)被移除
//shoppingList現(xiàn)在只有6項(xiàng),而且不包括Maple Syrup
//mapleSyrup常量的值等于被移除數(shù)據(jù)項(xiàng)“Maple Syrup”

如果你只想把數(shù)組中的最后一項(xiàng)移除胆绊,可以使用removeLast()方法而不是remove(at:)方法來(lái)避免需要獲取數(shù)組的count屬性氨鹏。就像后者一樣,前者也會(huì)返回被移除的數(shù)據(jù)項(xiàng)压状。

let apples = shoppingList.removeLast()
//數(shù)組的最后一項(xiàng)被移除了
//shoppingList現(xiàn)在只有5項(xiàng)仆抵,不包括Apples
//apples常量的值現(xiàn)在等于字符串“Apples”

數(shù)組的遍歷

你可以使用for-in循環(huán)來(lái)遍歷數(shù)組中所有的數(shù)據(jù)項(xiàng)。

for item in shoppingList {
      print(item)
}
//Six eggs
//Milk
//Flour
//Baking Powder
//Bananas

如果同時(shí)需要每個(gè)數(shù)據(jù)項(xiàng)的值和索引值,可以使用enumerated()方法來(lái)進(jìn)行數(shù)組遍歷镣丑。enumerated()返回一個(gè)由索引值和數(shù)據(jù)值組成的元組數(shù)組舔糖。索引值從0開(kāi)始,并且每次增加1莺匠;如果枚舉整個(gè)數(shù)組金吗,索引值將會(huì)和數(shù)據(jù)值一一匹配。你可以把這個(gè)元組分解成臨時(shí)常量或者變量來(lái)進(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

數(shù)組的基本用法:

var numbers = [1,2,3,4,5]
var vowels = ["A","E","I","O","U"]
var emptyArray = [Int]()

// 數(shù)組長(zhǎng)度
vowels.count

// 判空
numbers.isEmpty
emptyArray3.isEmpty

// 獲取第一個(gè)元素和最后一個(gè)元素辽聊,返回的是可選型
vowels[0]
vowels.first
vowels.last
emptyArray3.first

if let firstVowel = vowels.first {
    print("The first vowel is " + firstVowel)
}
vowels.first!
vowels[vowels.count - 1]

// 獲取最小,最大值
numbers.min()
numbers.max()

// 使用范圍
numbers[2..<4]
numbers[2..<numbers.count]

// 包含
vowels.contains("A")
vowels.contains("B")

let letter = "A"
if vowels.contains(letter) {
    print("\(letter) is a vowel")
} else {
    print("\(letter) is not a vowel")
}

vowels.firstIndex(of: "E")
vowels.firstIndex(of: "F")

if let index = vowels.firstIndex(of: "E") {
    print("E is a vowel in position \(index+1).")
} else {
    print("E is not a vowel.")
}

for index in 0..<numbers.count {
    numbers[index]
}

for number in numbers {
    print(number)
}

for (i,vowel) in vowels.enumerated() {
    print("\(i+1):\(vowel)")
}

var oneToFive = [1,2,3,4,5]
numbers == oneToFive // 返回true

var oneToFive2 = [1,2,4,3,5]
numbers == oneToFive2 // 返回false

二維數(shù)組:

var board: Array<Array<Int>> = [
    [1024, 16, 2, 0],
    [256, 4, 2, 0],
    [64, 2, 0, 0],
    [2, 0, 0, 0] ]

board[0]
board[0][0]

board.count
board[0].count

board[0].append(0)
board

board.append([0, 0, 0, 0])
board += [[0,0,0,0]]

NSArray:

var array1: NSArray = []

var array2 = [1,2,3,4,5] as NSArray

var array3: NSArray = [1,"Hello",3.0]

var array4: Array<NSObject> = [1 as NSNumber,"hello" as NSString]

注:
1.removeFirst刪除第一個(gè)數(shù)組
2.removeSubrange刪除指定索引范圍內(nèi)的數(shù)組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末期贫,一起剝皮案震驚了整個(gè)濱河市跟匆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌通砍,老刑警劉巖玛臂,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異封孙,居然都是意外死亡迹冤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)虎忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泡徙,“玉大人,你說(shuō)我怎么就攤上這事膜蠢】懊辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵挑围,是天一觀(guān)的道長(zhǎng)礁竞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)杉辙,這世上最難降的妖魔是什么模捂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蜘矢,結(jié)果婚禮上狂男,老公的妹妹穿的比我還像新娘。我一直安慰自己品腹,他們只是感情好并淋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著珍昨,像睡著了一般县耽。 火紅的嫁衣襯著肌膚如雪句喷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天兔毙,我揣著相機(jī)與錄音唾琼,去河邊找鬼。 笑死澎剥,一個(gè)胖子當(dāng)著我的面吹牛锡溯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哑姚,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼祭饭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叙量?” 一聲冷哼從身側(cè)響起倡蝙,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绞佩,沒(méi)想到半個(gè)月后寺鸥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡品山,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年胆建,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肘交。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笆载,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涯呻,到底是詐尸還是另有隱情凉驻,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布魄懂,位于F島的核電站,受9級(jí)特大地震影響闯第,放射性物質(zhì)發(fā)生泄漏市栗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一咳短、第九天 我趴在偏房一處隱蔽的房頂上張望填帽。 院中可真熱鬧,春花似錦咙好、人聲如沸篡腌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘹悼。三九已至叛甫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杨伙,已是汗流浹背其监。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留限匣,地道東北人抖苦。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像米死,于是被迫代替她去往敵國(guó)和親锌历。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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