Swift程式設計語言學習3.1排列

來源:互聯網
上載者:User

標籤:

Swift 語言提供經典的數組和字典兩種集合類型來儲存集合資料。數組用來按順序儲存同樣類型的資料。字典儘管無序儲存同樣類型資料值可是須要由專屬的標識符引用和定址(就是鍵值對)。

 

Swift 語言裡的數組和字典中儲存的資料值類型必須明白。 這意味著我們不能把不對的資料類型插入當中。 同一時候這也說明我們全然能夠對擷取出的值類型很自信。 Swift 對顯式類型集合的使用確保了我們的代碼對工作所須要的類型很清楚,也讓我們在開發中能夠早早地找到不論什麼的類型不符錯誤。

 

注意:

 

Swift 的數組結構在被聲明成常量和變數或者被傳入函數與方法中時會相對於其它類型展現出不同的特性。擷取很多其它資訊請參見集合的可變性與集合在賦值和複製中的行為章節。

 

數組

數組使用有序列表格儲存體同樣類型的多重資料。同樣的值能夠多次出如今一個數組的不同位置中。

 

Swift 數組對儲存資料有詳細要求。 不同於 Objective-C 的NSArray和NSMutableArray類,他們能夠儲存不論什麼類型的執行個體並且不提供他們返回對象的不論什麼本質資訊。在 Swift 中,資料值在被儲存進入某個數組之前類型必須明白,方法是通過顯式的類型標註或類型判斷,並且不是必須是class類型。比如:假設我們建立了一個Int值類型的數組,我們不能往當中插入不論什麼不是Int類型的資料。 Swift 中的數組是型別安全的,並且它們中包括的類型必須明白。

數組的簡單文法

寫 Swift 數組應該遵循像Array<SomeType>這種形式,當中SomeType是這個數組中唯一同意存在的資料類型。我們也能夠使用像SomeType[]這種簡單文法。雖然兩種形式在功能上是一樣的,可是推薦較短的那種,並且在本文中都會使用這種形式來使用數組。

數組構造語句

我們能夠使用字面語句來進行數組構造,這是一種用一個或者多個數值構造數組的簡單方法。字面語句是一系列由逗號切割並由方括弧包括的數值。 [value 1, value 2, value 3]。

以下這個範例建立了一個叫做shoppingList而且儲存字串的數組:

 

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


shoppingList變數被聲明為“字串值類型的數組“,記作String[]。 由於這個數組被規定僅僅有String一種資料結構,所以僅僅有String類型能夠在當中被存取。 在這裡,shoppinglist數組由兩個String值("Eggs"和"Milk")構造,而且由字面語句定義。

 

注意:

 

Shoppinglist數組被聲明為變數(varkeyword建立)而不是常量(let建立)是由於以後可能會有很多其它的資料項目被插入當中。

在這個範例中,字面語句只包括兩個String值。匹配了該數組的變數聲明(只能包括String的數組),所以這個字面語句的分配過程就是同意用兩個初始項來構造shoppinglist。

 

因為 Swift 的類型判斷機制,當我們用字面語句構造僅僅擁有同樣類型值數組的時候,我們不必把數組的類型定義清楚。 shoppinglist的構造也能夠這樣寫:

 

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


由於全部字面語句中的值都是同樣的類型,Swift 能夠判斷出String[]是shoppinglist中變數的正確類型。

 

 

訪問和改動數組

我們能夠通過數組的方法和屬性來訪問和改動數組,或者下標文法。還能夠使用數組的僅僅讀屬性count來擷取數組中的資料項目數量。

 

println("The shopping list contains\(shoppingList.count) items.")// 輸出"The shoppinglist contains 2 items."(這個數組有2個項)


使用布爾項isEmpty來作為檢查count屬性的值是否為 0 的捷徑。

 if shoppingList.isEmpty {   println("The shopping list is empty.")} else {   println("The shopping list is not empty.")}// 列印 "The shoppinglist is not empty."(shoppinglist不是空的)



也能夠使用append方法在數組後面加入新的資料項目:

 

shoppingList.append("Flour")// shoppingList 如今有3個資料項目,有人在攤煎餅


除此之外,使用加法賦值運算子(+=)也能夠直接在數組後面加入資料項目:

 

shoppingList += "Baking Powder"// shoppingList 如今有四項了


我們也能夠使用加法賦值運算子(+=)直接加入擁有同樣類型資料的數組。

 

shoppingList += ["ChocolateSpread", "Cheese", "Butter"]// shoppingList 如今有7項了


能夠直接使用下標文法來擷取數組中的資料項目,把我們須要的資料項目的索引值放在直接放在數組名稱的方括弧裡:

 

var firstItem = shoppingList[0]// 第一項是 "Eggs"


注意第一項在數組中的索引值是0而不是1。 Swift 中的數組索引總是從零開始。

 

我們也能夠用下標來改變某個已有索引值相應的資料值:

 

shoppingList[0] = "Six eggs"// 當中的第一項如今是 "Sixeggs" 而不是 "Eggs"


還能夠利用下標來一次改變一系列資料值,即使新資料和原有資料的數量是不一樣的。以下的範例把"Chocolate Spread","Cheese",和"Butter"替換為"Bananas"和"Apples":

 

shoppingList[4...6] = ["Bananas","Apples"]// shoppingList 如今有六項


注意:

 

我們不能使用下標文法在數組尾部加入新項。假設我們試著用這樣的方法對索引越界的資料進行檢索或者設定新值的操作,我們會引發一個執行期錯誤。我們能夠使用索引值和數組的count屬性進行比較來在使用某個索引之前先檢驗是否有效。除了當count等於 0 時(說明這是個空數組),最大索引值一直是count - 1,由於數組都是零起索引。

調用數組的insert(atIndex:)方法來在某個詳細索引值之前加入資料項目:

 

shoppingList.insert("MapleSyrup", atIndex: 0)// shoppingList 如今有7項// "Maple Syrup" 如今是這個列表中的第一項


這次insert函數調用把值為"Maple Syrup"的新資料項目插入列表的最開始位置,而且使用0作為索引值。

 

類似的我們能夠使用removeAtIndex方法來移除數組中的某一項。這種方法把數組在特定索引值中儲存的資料項目移除而且返回這個被移除的資料項目(我們不須要的時候就能夠無視它):

 

let mapleSyrup =shoppingList.removeAtIndex(0)//索引值為0的資料項目被移除// shoppingList 如今僅僅有6項,並且不包含MapleSyrup// mapleSyrup常量的值等於被移除資料項目的值"Maple Syrup"


資料項目被移除後數組中的空出項會被自己主動填補,所以如今索引值為0的資料項目的值再次等於"Six eggs":

 

firstItem = shoppingList[0]// firstItem 如今等於 "Sixeggs"


假設我們僅僅想把數組中的最後一項移除,能夠使用removeLast方法而不是removeAtIndex方法來避免我們須要擷取數組的count屬性。就像後者一樣,前者也會返回被移除的資料項目:

 

let apples = shoppingList.removeLast()// 數組的最後一項被移除了// shoppingList如今僅僅有5項,不包含cheese// apples 常量的值如今等於"Apples" 字串


 

數組的遍曆

我們能夠使用for-in迴圈來遍曆全部數組中的資料項目:

 

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


假設我們同一時候須要每個資料項目的值和索引值,能夠使用全域enumerate函數來進行數組遍曆。enumerate返回一個由每個資料項目索引值和資料值組成的鍵值對組。我們能夠把這個鍵值對組分解成暫時常量或者變數來進行遍曆:

 

for (index, value) inenumerate(shoppingList) {   println("Item \(index + 1): \(value)")}// Item 1: Six eggs// Item 2: Milk// Item 3: Flour// Item 4: Baking Powder// Item 5: Bananas


很多其它關於for-in迴圈的介紹請參見for 迴圈。

 

 

建立而且構造一個數組

我們能夠使用構造文法來建立一個由特定資料類型構成的空數組:

 

var someInts = Int[]()println("someInts is of type Int[]with \(someInts。count) items。")// 列印 "someInts isof type Int[] with 0 items。"(someInts是0資料項目的Int[]數組)


注意someInts被設定為一個Int[]建構函式的輸出所以它的變數類型被定義為Int[]。

 

除此之外,假設代碼上下文中提供了類型資訊,比如一個函數參數或者一個已經定義好類型的常量或者變數,我們能夠使用空數組語句建立一個空數組,它的寫法非常easy:[](一對空方括弧):

 

someInts.append(3)// someInts 如今包括一個INT值someInts = []// someInts 如今是空數組,可是仍然是Int[]類型的。


Swift 中的Array類型還提供一個能夠建立特定大小而且全部資料都被預設的構造方法。我們能夠把準備增加新數組的資料項目數量(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 is inferred asDouble[], and equals [2.5, 2.5, 2.5]


最後,我們能夠使用加法操作符(+)來組合兩種已存在的同樣類型數組。新數組的資料類型會被從兩個數組的資料類型中判斷出來:

 

var sixDoubles = threeDoubles +anotherThreeDoubles// sixDoubles 被判斷為Double[], 等於 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]


Swift程式設計語言學習3.1排列

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.