注: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ù)組