在本教程中,您將學習數(shù)組,創(chuàng)建數(shù)組,訪問數(shù)組的值以及數(shù)組中的一些常見操作。
在上一篇Swift 數(shù)據(jù)類型文章中,我們學習了如何創(chuàng)建可以保存單個值的某些數(shù)據(jù)類型變量/常量。
但是,如果我們要存儲相同數(shù)據(jù)類型的多個值怎么辦。我們在Swift中使用稱為 數(shù)組 的東西。
數(shù)組只是一個容器,可以在一個有序列表中保存一個數(shù)據(jù)類型的多個數(shù)據(jù)(值),即,您以與定義數(shù)組中各項相同的順序來獲取元素。
數(shù)組可以存儲任何類型的數(shù)據(jù)例如 Int,String,Class 等值。
您可以通過在方括號內(nèi) [] 指定數(shù)據(jù)類型來創(chuàng)建一個空數(shù)組。
請記住,您必須在方括號內(nèi)包括類型,否則Swift會將其視為普通數(shù)據(jù)類型,并且您只能在其中存儲一個值。
let emptyIntArr:[Int] = [] print(emptyIntArr)
運行該程序時,輸出為:
[ ]
在上面的程序中,我們聲明了一個常量 emptyIntArr,該常量可以存儲整數(shù)數(shù)組并使用0值初始化。
或者
您還可以如下定義一個空數(shù)組:
let emptyIntArr:Array<Int> = Array() print(emptyIntArr)
或者
由于swift是一種類型推斷語言,因此您也可以不指定數(shù)據(jù)類型而直接創(chuàng)建數(shù)組,但必須使用一些值進行初始化,以便編譯器可以將其類型推斷為:
let someIntArr = [1, 2, 3, 4, 5, 6, 7, 8, 9] print(someIntArr)
運行該程序時,輸出為:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
在上面的程序中,我們聲明了一個常量 someIntArr,可以存儲 Integer 數(shù)組,而無需顯式指定類型。另外,我們用值 1、2、3、4、5、6、7、8、9 初始化了數(shù)組。
您還可以將值重復指定的次數(shù),以在Swift中組成數(shù)組。這是通過將數(shù)組初始化器與 repeating和count 一起使用來完成的。
let arrWithRepeatingValues = Array(repeating: "Hello, World", count: 4) print(arrWithRepeatingValues)
運行該程序時,輸出為:
["Hello, World", "Hello, World", "Hello, World", "Hello, World"]
在以上程序中,我們定義了一個常量 arrWithRepeatingValues,該常量存儲字符串 Hello,World 的數(shù)組,并重復相同的值4次,如示例中所指定count。
注意:在Swift中,不能像在其他編程語言中那樣創(chuàng)建定長大小的數(shù)組。固定長度大小的數(shù)組意味著,數(shù)組不能包含比您在初始化期間定義的元素更多的元素。
假設您有一個可以存儲字符串數(shù)組的常量,如下所示:
let intArr = [21, 34, 54, 12]
值如何存儲在數(shù)組中的圖形表示如下所示:
您創(chuàng)建的所有數(shù)組都從索引0開始。第一個元素存儲在索引0中,第二個元素存儲在下一個索引(1)中,依此類推。
您可以使用 下標語法來訪問數(shù)組的元素,即您需要在數(shù)組名稱后的方括號內(nèi)包括要訪問的值的索引。
假設您如上所述聲明了一個數(shù)組 intArr 。那么第一個元素是intArr[0],第二個元素是intArr[1],依此類推。
let intArr = [21, 34, 54, 12] print(intArr[0]) print(intArr[1]) print(intArr[2]) print(intArr[3])
運行該程序時,輸出為:
21 34 54 12
您還可以使用for-in循環(huán)訪問數(shù)組的元素。有關(guān)更多信息,請參考Swift for-in循環(huán)。
你可以使用下標語法和賦值操作符來修改數(shù)組的元素,也就是說,你需要在數(shù)組名稱后面的方括號中包含你想要更新的值的索引,然后是賦值操作符和新值。
var intArr = [21, 34, 54, 12] intArr[0] = 12 intArr[1] = 42 intArr[2] = 45 intArr[3] = 21 print(intArr)
運行該程序時,輸出為:
[12, 42, 45, 21]
您還可以使用以下新值修改數(shù)組的所有元素,如下所示:
var intArr = [21, 34, 54, 12] intArr = [1,2,3] print(intArr)
運行該程序時,輸出為:
[1, 2, 3]
但是,要將新元素添加到現(xiàn)有數(shù)組,則不能使用下標語法。如果這樣做,最終將導致錯誤。您不能執(zhí)行以下操作:
var intArr = [21, 34, 54, 12] intArr[4] = 10
運行該程序時,輸出為:
fatal error: Index out of range
在將新元素分配給數(shù)組 intArr 時,上述程序給出了錯誤。這是因為 intArr 尚未為索引4分配額外的內(nèi)存,并且無法存儲給定的值。
為了正確地將新元素插入數(shù)組,我們使用array的append()方法。后面會介紹append()使用方法。
此屬性確定數(shù)組是否為空。如果一個數(shù)組中不包含任何值,則它返回true,否則返回false。
let intArr = [21, 34, 54, 12] print(intArr.isEmpty)
運行該程序時,輸出為:
false
此屬性用于訪問數(shù)組的第一個元素。
let intArr = [21, 34, 54, 12] print(intArr.first)
運行該程序時,輸出為:
Optional(21)
同樣,您可以使用 last 屬性訪問數(shù)組的最后一個元素。
append函數(shù)用于在數(shù)組末尾插入/附加元素。
var intArr = [21, 34, 54, 12] intArr.append(32) print(intArr)
運行該程序時,輸出為:
[21, 34, 54, 12, 32]
您還可以將一個數(shù)組的內(nèi)容附加到另一個數(shù)組,如下所示:
var firstArr = [1,2,3,4] var secondArr = [5,6,7,8] firstArr.append(contentsOf: secondArr) print(firstArr)
運行該程序時,輸出為:
[1, 2, 3, 4, 5, 6, 7, 8]
此函數(shù)用于在數(shù)組的特定索引處插入/附加元素。
var intArr = [21,34,54,12] intArr.insert(22, at: 1) print(intArr)
運行該程序時,輸出為:
[21, 22, 34, 54, 12]
同樣,您也可以使用removeproperty刪除指定索引處的元素。
此函數(shù)從數(shù)組中刪除并返回在指定位置指定的值。
var strArr = ["ab","bc","cd","de"] let removedVal = strArr.remove(at: 1) print("removed value is \(removedVal)") print(strArr)
運行該程序時,輸出為:
removed value is bc ["ab", "cd", "de"]
同樣,您也可以使用removeFirst刪除數(shù)組的第一個元素,removeLast刪除數(shù)組的最后一個元素以及removeAll清空數(shù)組的功能。
此函數(shù)以相反的順序返回數(shù)組的元素。
var intArr = [21,22,23,24] let reversedArr = Array(intArr.reversed()) print(reversedArr)
運行該程序時,輸出為:
[24, 23, 22, 21]
此屬性返回數(shù)組中元素的總數(shù)。
let floatArr = [10.2,21.3,32.0,41.3] print(floatArr.count)
運行該程序時,輸出為:
4
在Swift中使用下標語法訪問數(shù)組元素時,必須確保該值位于索引中,否則將導致運行時崩潰。讓我們在示例中看一下:
let intArr = [21, 34, 54, 12] print(intArr[-1])
運行該程序時,輸出為:
fatal error: Index out of range
在上面的程序中,索引 -1 中沒有值。因此,當您嘗試訪問索引中的值時,將發(fā)生運行時崩潰。
為防止這種情況,請首先找到要刪除的元素的索引。然后刪除索引處的元素,如下所示:
var intArr = [21, 34, 54, 12] if let index = intArr.index(of: 34) { print("found index") let val = intArr.remove(at: index) print(val) }
運行該程序時,輸出為:
found index 34