Swift 集合類型

Swift 語言提供Arrays、Sets和Dictionaries三種基本的集合類型用來存儲集合數(shù)據(jù)。數(shù)組(Arrays)是有序數(shù)據(jù)的集。集合(Sets)是無序無重復數(shù)據(jù)的集。字典(Dictionaries)是無序的鍵值對的集。Swift 語言中的Arrays、Sets和Dictionaries中存儲的數(shù)據(jù)值類型必須明確。這意味著我們不能把不正確的數(shù)據(jù)類型插入其中。同時這也說明我們完全可以對取回值的類型非常自信。

集合的可變性

如果創(chuàng)建一個Arrays、Sets或Dictionaries并且把它分配成一個變量,這個集合將會是可變的。這意味著我們可以在創(chuàng)建之后添加更多或移除已存在的數(shù)據(jù)項,或者改變集合中的數(shù)據(jù)項。如果我們把Arrays、Sets或Dictionaries分配成常量,那么它就是不可變的,它的大小和內(nèi)容都不能被改變。


數(shù)組(Arrays)

寫 Swift 數(shù)組應該遵循像Array<Element>這樣的形式,其中Element是這個數(shù)組中唯一允許存在的數(shù)據(jù)類型。我們也可以使用像[Element]這樣的簡單語法。

創(chuàng)建數(shù)組

可以使用構(gòu)造語法來創(chuàng)建一個由特定數(shù)據(jù)類型構(gòu)成的空數(shù)組

var someInts = [Int]()

print("someInts is of type [Int] with \(someInts.count) items.")

// 打印 "someInts is of type [Int] with 0 items."

someInts.append(3)

// someInts 現(xiàn)在包含一個 Int 值

someInts = []

// someInts 現(xiàn)在是空數(shù)組,但是仍然是 [Int] 類型的。

Swift 中的Array類型還提供一個可以創(chuàng)建特定大小并且所有數(shù)據(jù)都被默認的構(gòu)造方法。我們可以把準備加入新數(shù)組的數(shù)據(jù)項數(shù)量(count)和適當類型的初始值(repeating)傳入數(shù)組構(gòu)造函數(shù)

var threeDoubles = Array(repeating: 0.0, count: 3)

// threeDoubles 是一種 [Double] 數(shù)組,等價于 [0.0, 0.0, 0.0]

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

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]

可以使用數(shù)組字面量來進行數(shù)組構(gòu)造,這是一種用一個或者多個數(shù)值構(gòu)造數(shù)組的簡單方法。數(shù)組字面量是一系列由逗號分割并由方括號包含的數(shù)值 [value 1, value 2, value 3]

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

// shoppingList 已經(jīng)被構(gòu)造并且擁有兩個初始項。

訪問和修改數(shù)組

可以使用數(shù)組的只讀屬性count來獲取數(shù)組中的數(shù)據(jù)項數(shù)量

使用布爾屬性isEmpty作為一個縮寫形式去檢查count屬性是否為0

也可以使用append(_:)方法在數(shù)組后面添加新的數(shù)據(jù)項

使用下標語法來獲取數(shù)組中的數(shù)據(jù)項,把我們需要的數(shù)據(jù)項的索引值放在直接放在數(shù)組名稱的方括號中

可以用下標來改變某個已有索引值對應的數(shù)據(jù)值

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

shoppingList[4...6] = ["Bananas", "Apples"]

// shoppingList 現(xiàn)在有6項

調(diào)用數(shù)組的insert(_:at:)方法來在某個具體索引值之前添加數(shù)據(jù)項

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

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

數(shù)組的遍歷

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

如果我們同時需要每個數(shù)據(jù)項的值和索引值,可以使用enumerated()方法來進行數(shù)組遍歷。enumerated()返回一個由每一個數(shù)據(jù)項索引值和數(shù)據(jù)值組成的元組。我們可以把這個元組分解成臨時常量或者變量來進行遍歷

for (index, value) in shoppingList.enumerated() {

? ? print("Item \(String(index + 1)): \(value)")

}


集合(Sets)

Swift 中的Set類型被寫為Set,這里的Element表示Set中允許存儲的類型,和數(shù)組不同的是,集合沒有等價的簡化形式。

創(chuàng)建集合

可以通過構(gòu)造器語法創(chuàng)建一個特定類型的空集合

var letters = Set()

print("letters is of type Setwith \(letters.count) items.")

// 打印 "letters is of type Setwith 0 items."

letters.insert("a")

// letters 現(xiàn)在含有1個 Character 類型的值

letters = []

// letters 現(xiàn)在是一個空的 Set, 但是它依然是 Set類型

可以使用數(shù)組字面量來構(gòu)造集合,并且可以使用簡化形式寫一個或者多個值作為集合元素

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

// favoriteGenres 被構(gòu)造成含有三個初始值的集合

一個Set類型不能從數(shù)組字面量中被單獨推斷出來,因此Set類型必須顯式聲明。然而,由于 Swift 的類型推斷功能,如果你想使用一個數(shù)組字面量構(gòu)造一個Set并且該數(shù)組字面量中的所有元素類型相同,那么你無須寫出Set的具體類型。favoriteGenres的構(gòu)造形式可以采用簡化的方式代替

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

訪問和修改集合

可以使用其只讀屬性count找出一個Set中元素的數(shù)量

使用布爾屬性isEmpty作為一個縮寫形式去檢查count屬性是否為0

通過調(diào)用Set的insert(_:)方法來添加一個新元素

通過調(diào)用Set的remove(_:)方法去刪除一個元素,如果該值是該Set的一個元素則刪除該元素并且返回被刪除的元素值,否則如果該Set不包含該值,則返回nil。另外,Set中的所有元素可以通過它的removeAll()方法刪除

使用contains(_:)方法去檢查Set中是否包含一個特定的值

集合的遍歷

可以在一個for-in循環(huán)中遍歷一個Set中的所有值

Swift 的Set類型沒有確定的順序,為了按照特定順序來遍歷一個Set中的值可以使用sorted()方法,它將返回一個有序數(shù)組,這個數(shù)組的元素排列順序由操作符'<'對元素進行比較的結(jié)果來確定

for genre in favoriteGenres.sorted() {

? ? print("\(genre)")

}

// prints "Classical"

// prints "Hip hop"

// prints "Jazz

集合操作


集合各種操作的結(jié)果

集合成員關(guān)系和相等

使用“是否相等”運算符(==)來判斷兩個集合是否包含全部相同的值。

使用isSubset(of:)方法來判斷一個集合中的值是否也被包含在另外一個集合中。

使用isSuperset(of:)方法來判斷一個集合中包含另一個集合中所有的值。

使用isStrictSubset(of:)或者isStrictSuperset(of:)方法來判斷一個集合是否是另外一個集合的子集合或者父集合并且兩個集合并不相等。

使用isDisjoint(with:)方法來判斷兩個集合是否不含有相同的值(是否沒有交集)。


字典(Dictionaries)

Swift 的字典使用Dictionary定義,其中Key是字典中鍵的數(shù)據(jù)類型,Value是字典中對應于這些鍵所存儲值的數(shù)據(jù)類型。我們也可以用[Key: Value]這樣簡化的形式去創(chuàng)建一個字典類型。

創(chuàng)建字典

可以像數(shù)組一樣使用構(gòu)造語法創(chuàng)建一個擁有確定類型的空字典

var namesOfIntegers = [Int: String]()

// namesOfIntegers 是一個空的 [Int: String] 字典

namesOfIntegers[16] = "sixteen"

// namesOfIntegers 現(xiàn)在包含一個鍵值對

namesOfIntegers = [:]

// namesOfIntegers 又成為了一個 [Int: String] 類型的空字典

可以使用字典字面量來構(gòu)造字典,這和我們剛才介紹過的數(shù)組字面量擁有相似語法。字典字面量是一種將一個或多個鍵值對寫作Dictionary集合的快捷途徑。

var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

訪問和修改字典

通過字典的只讀屬性count來獲取某個字典的數(shù)據(jù)項數(shù)量

使用布爾屬性isEmpty作為一個縮寫形式去檢查count屬性是否為0

可以在字典中使用下標語法來添加新的數(shù)據(jù)項。可以使用一個恰當類型的鍵作為下標索引,并且分配恰當類型的新值

也可以使用下標語法來改變特定鍵對應的值

字典的updateValue(_:forKey:)方法可以設置或者更新特定鍵對應的值,在這個鍵不存在對應值的時候會設置新值或者在存在時更新已存在的值,返回更新值之前的原值

if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {

? ? print("The old value for DUB was \(oldValue).")

}

// 輸出 "The old value for DUB was Dublin."

可以使用下標語法來在字典中檢索特定鍵對應的值。因為有可能請求的鍵沒有對應的值存在,字典的下標訪問會返回對應值的類型的可選值。如果這個字典包含請求鍵所對應的值,下標會返回一個包含這個存在值的可選值,否則將返回nil

if let airportName = airports["DUB"] {

? ? print("The name of the airport is \(airportName).")

} else {

? ? print("That airport is not in the airports dictionary.")

}

// 打印 "The name of the airport is Dublin Airport."

可以使用下標語法來通過給某個鍵的對應值賦值為nil來從字典里移除一個鍵值對

airports["APL"] = "Apple Internation"

// "Apple Internation" 不是真的 APL 機場, 刪除它

airports["APL"] = nil

// APL 現(xiàn)在被移除了

removeValue(forKey:)方法也可以用來在字典中移除鍵值對。這個方法在鍵值對存在的情況下會移除該鍵值對并且返回被移除的值或者在沒有值的情況下返回nil

if let removedValue = airports. removeValue(forKey: "DUB") {

? ? print("The removed airport's name is \(removedValue).")

} else {

? ? print("The airports dictionary does not contain a value for DUB.")

}

// prints "The removed airport's name is Dublin Airport."

字典的遍歷

可以使用for-in循環(huán)來遍歷某個字典中的鍵值對。每一個字典中的數(shù)據(jù)項都以(key, value)元組形式返回,并且我們可以使用臨時常量或者變量來分解這些元組

通過訪問keys或者values屬性,我們也可以遍歷字典的鍵或者值

for airportCode in airports.keys {

? ? print("Airport code: \(airportCode)")

}

// Airport code: YYZ

// Airport code: LHR

for airportName in airports.values {

? ? print("Airport name: \(airportName)")

}

// Airport name: Toronto Pearson

// Airport name: London Heathrow

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

相關(guān)閱讀更多精彩內(nèi)容

  • Swift 語言提供Arrays、Sets和Dictionaries三種基本的集合類型用來存儲集合數(shù)據(jù)。數(shù)組(Ar...
    窮人家的孩紙閱讀 649評論 3 2
  • 前言 3月27號蘋果發(fā)布了Swift3.1,官方教程也更新到了3.1,查看更新記錄發(fā)現(xiàn)更新的內(nèi)容對之前的文章并沒有...
    BoomLee閱讀 3,248評論 0 4
  • 1 .數(shù)組 Arrays 數(shù)組使用有序列表存儲同一類型的多個值。相同的值可以多次出現(xiàn)在一個數(shù)組的不同位置中。這和O...
    iceMaple閱讀 549評論 0 1
  • Cherish what you have at the moment. 且行且珍惜。
    天心火狐閱讀 324評論 0 0
  • 你還在生氣是嗎?感覺你還是有點不高興似的 我拒絕了你一次 所以你就開始記恨我么 今天雙十一也本來想給你買東西呢 可...
    小氣鬼丶Sue閱讀 186評論 0 0

友情鏈接更多精彩內(nèi)容