Swift5.1—數組(Arrays)

注:Swift的Array類型被橋接到Foundation中的NSArray類。

數組的簡單語法

Swift中數組的完整寫法為Array<Element>,其中Element是這個數組中唯一允許存在的數據類型。也可以使用像[Element]這樣的簡單語法。盡管兩種形式在功能上是一樣的,但是推薦較短的那種,而且在本文中都會使用這種形式來使用數組。

創(chuàng)建一個空數組

你可以使用構造語法來創(chuàng)建一個由特定數據類型構成的空數組。

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

注意,通過構造函數的類型,someInts 的值類型被推斷為 [Int]。

或者,如果代碼上下文中已經提供了類型信息,例如一個函數參數或者一個已經定義好類型的常量或者變量,你可以使用空數組語句創(chuàng)建一個空數組,它的寫法很簡單:[](一對空方括號)。

someInts.append(3)
//someInts現(xiàn)在包含一個Int值
someInts = [ ]
//someInts現(xiàn)在是空數組,但是仍然是[Int]類型的。

創(chuàng)建一個帶有默認值的數組

Swift 中的 Array 類型還提供一個可以創(chuàng)建特定大小并且所有數據都被默認的構造方法??梢园褱蕚浼尤胄聰到M的數據項數量(count)和適當類型的初始值(repeating)傳入數組構造函數。

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

通過兩個數組相加創(chuàng)建一個數組

你可以使用加法操作符(+)來組合兩個已存在的相同類型數組。新數組的數據類型會從兩個數組的數據類型中推斷出來。

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]

用數組字面量構造數組

你可以使用數組字面量來進行數組構造,這是一種用一個或者多個數值構造數組的簡單方法。數組字面量是一系列由逗號分隔并由方括號包含的數值。

[value 1,value 2,value 3]

下面這個例子創(chuàng)建了一個叫做shoppingList并且存儲String的數組。

var shoppingList:[String] = ["Eggs","Milk"]
//shoppingList已經被構造并且擁有兩個初始項

shoppingList變量被聲明為“字符串值類型的數組”,記作[String]。因為這個數組被規(guī)定只有String一種數據結構,所以只有String類型可以在其中被存取。在這里,shoppingList 數組由兩個 String 值("Eggs" 和 "Milk")構造,并且由數組字面量定義。

注:shoppingList數組被聲明為變量(var關鍵字創(chuàng)建)而不是常量(let創(chuàng)建)是因為之后會有更多的數據項被插入其中。

在這個例子中,字面量僅僅包含兩個String值。匹配了該數組的聲明(只能包含String的數組),所以可以將這個字面量的賦值過程看作用兩個初始項來構造shoppingList的一種方式。

由于Swift的類型推斷機制,當你用字面量構造擁有相同類型值數組的時候,不必把數組的類型定義清楚。shoppingList的構造也可以這樣寫。

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

訪問和修改數組

你可以通過數組的方法和屬性來訪問和修改數組,或者使用下標語法。

可以使用數組的只讀屬性count來獲取數組中的數據項數量。

print("The shopping list coutains \(shoppingList.count) items.")
//輸出“The shopping list contains 2 items.”(這個數組有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(_:)方法在數組后面添加新的數據項。

shoppingList.append("Flour")
//shoppingList現(xiàn)在有3個數據項

除此之外,也可以使用加法賦值運算符(+=)直接將另一個相同類型數組中的數據添加到該數組后面。

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

可以利用下標來一次改變一系列數據值,即使新數據和原有數據的數量是不一樣的。下面的例子把"Chocolate Spread"、"Cheese"和"Butter"替換為"Bananas"和"Apples"。

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

通過調用數組的insert(_:at:)方法在某個指定索引值之前添加數據項。

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

類似的可以使用remove(at:)方法來移除數組中的某一項。這個方法把數組在特定索引值中存儲的數據項移除并且返回這個被移除的數據項(不需要的時候就可以無視它)。

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

如果你只想把數組中的最后一項移除,可以使用removeLast()方法而不是remove(at:)方法來避免需要獲取數組的count屬性。就像后者一樣,前者也會返回被移除的數據項。

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

數組的遍歷

你可以使用for-in循環(huán)來遍歷數組中所有的數據項。

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

如果同時需要每個數據項的值和索引值,可以使用enumerated()方法來進行數組遍歷。enumerated()返回一個由索引值和數據值組成的元組數組。索引值從0開始,并且每次增加1;如果枚舉整個數組,索引值將會和數據值一一匹配。你可以把這個元組分解成臨時常量或者變量來進行遍歷。

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

數組的基本用法:

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

// 數組長度
vowels.count

// 判空
numbers.isEmpty
emptyArray3.isEmpty

// 獲取第一個元素和最后一個元素,返回的是可選型
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

二維數組:

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刪除第一個數組
2.removeSubrange刪除指定索引范圍內的數組

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容