數組
數組使用有序列表存儲相同類型的多重數據。相同的值可以多次出現在一個數組的不同位置中。
寫 Swift 數組應該遵循像 Array<SomeType>這樣的形式,其中 sometype 是這個數組中唯一允許存在的數據類型。 我們也可以使用像 SomeType[]這樣的簡單語法。 儘管兩種形式在功能上是一樣的, 但是我們推薦較短的那種,而且在本文中都會使用這種形式來使用數組。
數組構造語句
我們可以使用字面語句來進行數組構造,這是一種用一個或者多個數值構造數組的簡單方法。字面語句是一系列由逗號分割並由方括號包含的數值。 [value 1, value 2, value 3]。
下面這個例子創建了一個叫做 shoppingList 並且存儲字符串的數組:
1. var shoppingList: String[] = ["Eggs", "Milk"]
2. // shoppingList 已經被構造並且擁有兩個初始項。
shoppingList 變量被聲明爲“字符串值類型的數組“,記作 String[]。 因爲這個數組被規定只有 String 一種數據結構,所以只有 String 類型可以在其中被存取。 在這裏,shoppinglist數組由兩個 String 值("Eggs" 和"Milk")構造,並且由字面語句定義。
注意: Shoppinglist 數組被聲明爲變量(var 關鍵字創建)而不是常量(let 創建)是因爲以後可能會有更多的數據項被插入其中。 由 於 Swift 的類型推斷機制,當我們用字面語句構造只擁有相同類型值數組的時候,我們不必把數組的類型定義清楚。 shoppinglist 的構造也可以這樣寫:
1. var shoppingList = ["Eggs", "Milk"]
我們可以通過數組的方法和屬性來訪問和修改數組,或者下標語法。 還可以使用數組的只讀屬性 count 來獲取數組中的數據項數量。
1. println("The shopping list contains \(shoppingList.count) items.")
2. // 打印出"The shopping list contains 2 items."(這個數組有 2個項)
使用布爾項 isEmpty 來作爲檢查 count 屬性的值是否爲 0 的捷徑。
1. if shoppingList.isEmpty {
2. println("The shopping list is empty.")
3. } else {
4. println("The shopping list is not empty.")
5. }
6. // 打印 "The shopping list is not empty."(shoppinglist不是空的)
也可以使用 append 方法在數組後面添加新的數據項:
1. shoppingList.append("Flour")
2. // shoppingList 現在有 3個數據項,有人在攤煎餅
除此之外,使用加法賦值運算符(+=)也可以直接在數組後面添加數據項:
1. shoppingList += "Baking Powder"
2. // shoppingList 現在有四項了
我們也可以使用加法賦值運算符(+=)直接添加擁有相同類型數據的數組。
1. shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
2. // shoppingList 現在有 7項了
可以直接使用下標語法來獲取數組中的數據項,把我們需要的數據項的索引值放在直接放在數組名稱的方括號中:
1. var firstItem = shoppingList[0]
2. // 第一項是 "Eggs"
注意第一項在數組中的索引值是 0 而不是 1。 Swift 中的數組索引總是從零開始。
我們也可以用下標來改變某個已有索引值對應的數據值:
1. shoppingList[0] = "Six eggs"
2. // 其中的第一項現在是 "Six eggs" 而不是 "Eggs"
還可以利用下標來一次改變一系列數據值,即使新數據和原有數據的數量是不一樣的。下面的例子把"Chocolate Spread","Cheese",和"Butter"替換爲"Bananas"和 "Apples":
1. shoppingList[4...6] = ["Bananas", "Apples"]
2. // shoppingList 現在有六項
注意: 我們不能使用下標語法在數組尾部添加新項。如果我們試着用這種方法對索引越界的數據進行檢索或者設置新值的操作,我們會引發一個運行期錯誤。我們可以使用索引值和數組的 count 屬性進行比較來在使用某個索引之前先檢驗是否有效。除了當 count 等於0時(說明這是個空數組),最大索引值一直是 count - 1,因爲數組都是零起索引。
調用數組的 insert(atIndex:)方法來在某個具體索引值之前添加數據項:
1. shoppingList.insert("Maple Syrup", atIndex: 0)
2. // shoppingList 現在有 7項
3. // "Maple Syrup" 現在是這個列表中的第一項
這次 insert 函數調用把值爲"Maple Syrup"的新數據項插入 shopping 列表的最開始位置,並且使用 0 作爲索引值。
類似的我們可以使用 removeAtIndex 方法來移除數組中的某一項。這個方法把數組在特定索引值中存儲的數據項移除並且返回這個被移除的數據項(我們不需要的時候就可以無視它):
1. let mapleSyrup = shoppingList.removeAtIndex(0)
2. //索引值爲 0的數據項被移除
3. // shoppingList 現在只有 6項,而且不包括 Maple Syrup
4. // mapleSyrup常量的值等於被移除數據項的值 "Maple Syrup"
數據項被移除後數組中的空出項會被自動填補,所以現在索引值爲 0 的數據項的值再次等於"Six eggs":
1. firstItem = shoppingList[0]
2. // firstItem 現在等於 "Six eggs"
如果我們只想把數組中的最後一項移除,可以使用 removeLast 方法而不是 removeAtIndex方法來避免我們需要獲取數組的 count 屬性。就像後者一樣,前者也會返回被移除的數據項:
1. let apples = shoppingList.removeLast()
2. // 數組的最後一項被移除了
3. // shoppingList現在只有 5項,不包括 cheese
4. // apples 常量的值現在等於"Apples" 字符串
數組使用有序列表存儲相同類型的多重數據。相同的值可以多次出現在一個數組的不同位置中。
Swift 數組對存儲數據有具體要求。不同於 Objective-C 的 NSArray 和 NSMutableArray類,他們可以存儲任何類型的實例而且不提供他們返回對象的任何本質信息。在 Swift 中,數據值在被存儲進入某個數組之前類型必須明確,方法是通過顯式的類型標註或類型推斷,而且不是必須是 class 類型。例如: 如果我們創建了一個 Int 值類型的數組,我們不能往其中插入任何不是 Int 類型的數據。 Swift 中的數組是類型安全的,並且它們中包含的類型必須明確。
寫 Swift 數組應該遵循像 Array<SomeType>這樣的形式,其中 sometype 是這個數組中唯一允許存在的數據類型。 我們也可以使用像 SomeType[]這樣的簡單語法。 儘管兩種形式在功能上是一樣的, 但是我們推薦較短的那種,而且在本文中都會使用這種形式來使用數組。
數組構造語句
我們可以使用字面語句來進行數組構造,這是一種用一個或者多個數值構造數組的簡單方法。字面語句是一系列由逗號分割並由方括號包含的數值。 [value 1, value 2, value 3]。
下面這個例子創建了一個叫做 shoppingList 並且存儲字符串的數組:
1. var shoppingList: String[] = ["Eggs", "Milk"]
2. // shoppingList 已經被構造並且擁有兩個初始項。
shoppingList 變量被聲明爲“字符串值類型的數組“,記作 String[]。 因爲這個數組被規定只有 String 一種數據結構,所以只有 String 類型可以在其中被存取。 在這裏,shoppinglist數組由兩個 String 值("Eggs" 和"Milk")構造,並且由字面語句定義。
注意: Shoppinglist 數組被聲明爲變量(var 關鍵字創建)而不是常量(let 創建)是因爲以後可能會有更多的數據項被插入其中。 由 於 Swift 的類型推斷機制,當我們用字面語句構造只擁有相同類型值數組的時候,我們不必把數組的類型定義清楚。 shoppinglist 的構造也可以這樣寫:
1. var shoppingList = ["Eggs", "Milk"]
因爲所有字面語句中的值都是相同的類型, Swift 可以推斷出 String[]是 shoppinglist 中變量的正確類型。
我們可以通過數組的方法和屬性來訪問和修改數組,或者下標語法。 還可以使用數組的只讀屬性 count 來獲取數組中的數據項數量。
1. println("The shopping list contains \(shoppingList.count) items.")
2. // 打印出"The shopping list contains 2 items."(這個數組有 2個項)
使用布爾項 isEmpty 來作爲檢查 count 屬性的值是否爲 0 的捷徑。
1. if shoppingList.isEmpty {
2. println("The shopping list is empty.")
3. } else {
4. println("The shopping list is not empty.")
5. }
6. // 打印 "The shopping list is not empty."(shoppinglist不是空的)
也可以使用 append 方法在數組後面添加新的數據項:
1. shoppingList.append("Flour")
2. // shoppingList 現在有 3個數據項,有人在攤煎餅
除此之外,使用加法賦值運算符(+=)也可以直接在數組後面添加數據項:
1. shoppingList += "Baking Powder"
2. // shoppingList 現在有四項了
我們也可以使用加法賦值運算符(+=)直接添加擁有相同類型數據的數組。
1. shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
2. // shoppingList 現在有 7項了
可以直接使用下標語法來獲取數組中的數據項,把我們需要的數據項的索引值放在直接放在數組名稱的方括號中:
1. var firstItem = shoppingList[0]
2. // 第一項是 "Eggs"
注意第一項在數組中的索引值是 0 而不是 1。 Swift 中的數組索引總是從零開始。
我們也可以用下標來改變某個已有索引值對應的數據值:
1. shoppingList[0] = "Six eggs"
2. // 其中的第一項現在是 "Six eggs" 而不是 "Eggs"
還可以利用下標來一次改變一系列數據值,即使新數據和原有數據的數量是不一樣的。下面的例子把"Chocolate Spread","Cheese",和"Butter"替換爲"Bananas"和 "Apples":
1. shoppingList[4...6] = ["Bananas", "Apples"]
2. // shoppingList 現在有六項
注意: 我們不能使用下標語法在數組尾部添加新項。如果我們試着用這種方法對索引越界的數據進行檢索或者設置新值的操作,我們會引發一個運行期錯誤。我們可以使用索引值和數組的 count 屬性進行比較來在使用某個索引之前先檢驗是否有效。除了當 count 等於0時(說明這是個空數組),最大索引值一直是 count - 1,因爲數組都是零起索引。
調用數組的 insert(atIndex:)方法來在某個具體索引值之前添加數據項:
1. shoppingList.insert("Maple Syrup", atIndex: 0)
2. // shoppingList 現在有 7項
3. // "Maple Syrup" 現在是這個列表中的第一項
這次 insert 函數調用把值爲"Maple Syrup"的新數據項插入 shopping 列表的最開始位置,並且使用 0 作爲索引值。
類似的我們可以使用 removeAtIndex 方法來移除數組中的某一項。這個方法把數組在特定索引值中存儲的數據項移除並且返回這個被移除的數據項(我們不需要的時候就可以無視它):
1. let mapleSyrup = shoppingList.removeAtIndex(0)
2. //索引值爲 0的數據項被移除
3. // shoppingList 現在只有 6項,而且不包括 Maple Syrup
4. // mapleSyrup常量的值等於被移除數據項的值 "Maple Syrup"
數據項被移除後數組中的空出項會被自動填補,所以現在索引值爲 0 的數據項的值再次等於"Six eggs":
1. firstItem = shoppingList[0]
2. // firstItem 現在等於 "Six eggs"
如果我們只想把數組中的最後一項移除,可以使用 removeLast 方法而不是 removeAtIndex方法來避免我們需要獲取數組的 count 屬性。就像後者一樣,前者也會返回被移除的數據項:
1. let apples = shoppingList.removeLast()
2. // 數組的最後一項被移除了
3. // shoppingList現在只有 5項,不包括 cheese
4. // apples 常量的值現在等於"Apples" 字符串