Swift中文教程(四) 集合類型來

更多Swift視頻教程:http://www.ruanman.net/swift.html

Swift 提供兩種集合類型來存儲集合,數組和字典。數組是一個同類型的序列化列表集合。字典是一個能夠使用類似於鍵的唯一標識符來獲取值的非序列化集合。

在Swift中,數組和字典的鍵和值都必須明確它的類型。這意味這數組和字典不會插入一個錯誤的類型的值,以致於出錯。這也意味着當你在數組和字典中取回數值的時候能夠確定它的類型。
Swift 使用確定的集合類型可以保證代碼工作是不會出錯,和讓你在開發階段就能更早的捕獲錯誤。
note:
Swift的數組 儲存不同的類型會展示出不同的行爲,例如變量,常量或者 函數和方法。更多的信息參見Mutability of Collections and Assignment 和 Copy Behavior for Collection Types. 來源:軟曼網

1、數組
數組是儲存同類型不同值的序列化列表。同樣的值可以在數組的不同位置出現多次。

Swift數組是儲存確定的值,這個Objective-C中的NSArray和NSMutableArray類是有區別的。因爲它們是儲存各種的對象,而且並不提供返回任何有關對象的具體信息。在Swift中,無論是確定的聲明,還是隱式的聲明,數組是非常確定它自身是儲存什麼樣的類型,而且,它並不一定要求儲存的是類對象。所以Swift數組是類型安全的,因爲它一直都確定它自身所能包含的值。

數組的簡略語法
定義數組的完整寫法是Array<SomeType>。其中SomeType是你想要包含的類型。你也可以使用類似於SomeType[]這樣的簡略語法。雖然這兩種方法在功能上是相同的。但是我們更推薦後者,而且它會一直貫穿於本書。

數組實量(Array Literals)
你可以用一個數組實量(Array Literals)來初始化一個數組,它是用簡略寫法來創建一個包含一個或多個的值的數組。一個數組實量(Array Literals)是由它包含的值,“,”分隔符 已經包括以上內容的中括號對“[]”組成:

[value 1, value 2, value 3]
來源:軟曼網

下面的例子創建一個叫shoppinglist,儲存字符串(String)類型的數組。

var shoppingList: String[] = ["Eggs", "Milk"] // 使用兩個初始化參數來初始化shoppingList

shoppinglist變量被定義爲字符串(String)類型的數組,寫作String[]。因爲這個數組被確定爲字符串類型(String),所以它只能儲存字符串(String)類型的值。在這裏,用兩個字符串類型的值(”Eggs” and “Milk”)和數組實量(Array Literals)的寫法來初始化shoppingList數組。

注意
shoppingList數組是被定義爲一個變量(使用var 標識符)而不是常量(使用let 標識符),所以在下面的例子可以直接添加元素。

在這個例子中,數組實量(Array Literals)只包含兩個字符串類型的值,這符合了shoppingList變量的定義(只能包含字符串(String)類型的數組),所以被分配的數組實量(Array Literals)被允許用兩個字符串類型的值來初始化。

得益於Swift的類型推斷,當你用相同類型的值來初始化時,你可以不寫明類型。初始化shoppingList可以用下面這個方法來代替。

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

因爲數組實量(Array Literals)中所有的值都是同類型的,所以Swift能夠推斷shoppingList的類型爲字符串數組(String[])。

讀取和修改數組
你可以通過方法和屬性,或者下標來讀取和修改數組。

通過只讀屬性count來讀取數組的長度;

println("The shopping list contains \(shoppingList.count) items.") 
// prints "The shopping list contains 2 items.”

通過一個返回布爾類型的isEmpty屬性檢查數組的長度是否爲0

if shoppingList.isEmpty 
{     
println("The shopping list is empty.") 
} 
else {     
println("The shopping list is not empty.") 
} // prints "The shopping list is not empty."

在數組末尾增加一個元素可以通過append方法

shoppingList.append("Flour") // shoppingList 現在包含3個元素

甚至,還可以用(+=)操作符來把一個元素添加到數組末尾

shoppingList += "Baking Powder" // shoppingList 現在包含4個元素

你也可以用(+=)操作符來把一個數組添加到另一個數組的末尾

shoppingList += ["Chocolate Spread", "Cheese", "Butter"] // shoppingList 現在包含7個元素

從數組中取出一個值可以使用下標語法。如果你知道一個元素的索引值,你可以數組名後面的中括號中填寫索引值來獲取這個元素

var firstItem = shoppingList[0] // firstItem 等於 “Eggs"


注意,數組的第一個元素的索引值爲0,不爲1,Swift的數組總是索引0;

你可以使用下標語法通過索引修改已經存在的值。

shoppingList[0] = "Six eggs" //列表中的第一個值等於"Six eggs" 而不等於 “Eggs"


你可以使用下標語法一次性改變一系列的值,儘管修改的區域遠遠大於要修改的值。在下面的雷子中, 替換掉 “Chocolate Spread”, “Cheese”,”Butter”,”Bananas”,”Apples”:

shoppingList[4...6] = ["Bananas", "Apples"] // shoppingList 現在包含6個元素


注意,你不能使用下標語法在數組中添加一個元素,如果你嘗試使用下標語法來獲取或者設置一個元素,你將得到一個運行時的錯誤。儘管如此,你可以通過count屬性驗證索引是否正確再使用它。當count爲0時(意味着數組爲空),則count-1超出了索引的有效範圍,因爲數組的索引總是從0開始。

在一個特定的索引位置插入一個值,可以使用insert(atIndex:)方法

shoppingList.insert("Maple Syrup", atIndex: 0) 
// shoppingList 現在包含7個元素 
// "Maple Syrup" 在數組的第一位


這裏調用insert方法指明在shoppingList的索引爲0的位置中插入一個新元素 “Maple Syrup”

同理,你可以調用removeAtIndex方法移除特定的元素。這個方法移除特定索引位置的元素,已經返回這個被移除的元素(儘管你並不關心這個返回值)。

let mapleSyrup = shoppingList.removeAtIndex(0) 
// 索引位置爲0的元素被移除  
// shoppingList 現在包含6個元素, 不包括 Maple Syrup 
// mapleSyrup 常量等於被移除的 "Maple Syrup" 字符串


當元素被移除的,數組空缺的位置將會被填補,所以現在索引位置爲0的元素再一次等於”Six eggs”:

firstItem = shoppingList[0] // firstItem 現在等於 "Six eggs”來源

:軟曼網

如果你從數組中移除最後一個元素,使用removeLast方法比removeAtIndex更方便,因爲後者需要通過count屬性計算數組的長度。和removeAtIndex方法一樣,removeLast會返回被移除的元素。

let apples = shoppingList.removeLast() 
//元素的最後一個元素被移除 
// shoppingList 現在包含5個元素,不包括 cheese
// apples 常量 現在等於被移除的 "Apples" string

遍歷數組
可以使用for-in循環來遍歷數組中的值

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

如果需要每一個元素的整形的索引值,使用enumerate函數代替會更方便,enumerate函數對於每一個元素都會返回一個包含元素的索引和值的元組(tuple)。你可以在遍歷部分分解元祖並儲存在臨時變量或者常量中。

for (index, value) in enumerate(shoppingList) 
{     
println("Item \(index + 1): \(value)") 
} 
// 元素 1: Six eggs 
// 元素 2: Milk 
// 元素 3: Flour 
// 元素 4: Baking Powder 來源:軟曼網
// 元素 5: Bananas

如需更多for-in 循環信息, 參見 For Loops.

創建和初始化數組
創建一個空的數組和確定的類型(不包含初始化值)使用的初始化語法:

var someInts = Int[]()
 println("someInts is of type Int[] with \(someInts.count) items.") 
// prints "someInts is of type Int[] with 0 items.”


注意,someInt變量被確定爲Int[],因爲它使用生成Int[]的初始化方法。

或者,如果上下文(context)已經提供類型信息,例如函數參數或者已經確定類型的常量和變量,你可以從空的數組實量(Array Literals)創建一個空數組,寫作[](空的中括號對)。

someInts.append(3) 
// someInts 現在包含1個Int型的元素 
someInts = [] 
// someInts 現在是一個空的數組, 但是類型仍然爲Int[];


Swift數組類型也提供初始化方法來創建確定長度和提供默認數值的數組。你可以通過這個初始化方法增加一個新的數組,元素的數量成爲count,合適的默認值爲repeatedValue

var threeDoubles = Double[](count: 3, repeatedValue: 0.0) 
// threeDoubles 的類型爲 Double[], 以及等於 [0.0, 0.0, 0.0]


得益於類型推斷,你並不需要指明這個數組儲存的類型就能使用這個初始化方法,因爲它從默認值中就能推斷出來。

var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5) 
// 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]


感謝翻譯小組成員:李起攀(微博)、若晨(微博)、YAO、糉子、山有木兮木有枝、渺-Bessie、墨離、矮人王、CXH、Tiger大顧(微博) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章