集合類型

集合類型

Swift提供了三種主要的集合類型,稱為數組,集合和字典,用于存儲值的集合。數組是有序的值集合。集合是唯一值的無序集合。字典是鍵值關聯的無序集合。

<figure class="figure" style="font-size: 0.8rem;">[圖片上傳失敗...(image-cc24e-1531103372854)]

</figure>

Swift中的數組,集合和字典總是清楚它們可以存儲的值和鍵的類型。這意味著您不能錯誤地將錯誤類型的值插入到集合中。這也意味著您可以確信您將從集合中檢索的值的類型。

注意

Swift的數組,集合和字典類型被實現為通用集合。有關泛型類型和集合的更多信息,請參閱泛型

集合的可變性

如果您創建數組,集合或字典,并將其分配給一個變量,則創建的集合將是可變的。這意味著,你可以改變(或變異它是由添加,刪除或改變集合中的項目創建后)的集合。如果將數組,集合或字典分配給常量,那么該集合是不可變的,并且其大小和內容不能更改。

注意

在集合不需要改變的所有情況下創建不可變集合是一個好習慣。這樣做可以讓您更輕松地推理代碼,并使Swift編譯器能夠優化您創建的集合的性能。

數組

一個陣列存儲在有序列表中的相同類型的值。相同的值可以在不同位置多次出現在陣列中。

注意

斯威夫特的Array類型被橋接到基金會的NSArray班級。

有關使用的詳細信息Array與基金會和可可,看到與可可數據類型的工作使用斯威夫特與可可和Objective-C(雨燕4.1)

數組類型速記語法

Swift數組的類型完全寫成Array<Element>,其中Element數組允許存儲的值的類型在哪里。你也可以用簡寫形式寫出數組的類型[Element]。盡管這兩種形式在功能上是相同的,但是在引用數組類型時,速記形式是優選的,并且貫穿本指南。

創建一個空數組

您可以使用初始化語法創建一個特定類型的空數組:

  1. var someInts = [Int]()
  2. print("someInts is of type [Int] with \(someInts.count) items.")
  3. // Prints "someInts is of type [Int] with 0 items."

請注意,someInts變量的類型被推斷為[Int]來自初始值設定項的類型。

或者,如果上下文已經提供了類型信息,例如函數參數或已經存在類型的變量或常量,則可以創建一個空數組,其中包含一個空數組文本,該文本寫為[](一對空括號):

  1. someInts.append(3)
  2. // someInts now contains 1 value of type Int
  3. someInts = []
  4. // someInts is now an empty array, but is still of type [Int]

用默認值創建一個數組

Swift的Array類型還提供了一個初始化器,用于創建一個具有特定大小的數組,并將其所有值設置為相同的默認值。您將此初始值設定項傳遞給適當類型(調用repeating)的默認值:以及在新數組(調用count)中重復該值的次數:

  1. var threeDoubles = Array(repeating: 0.0, count: 3)
  2. // threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]

通過一起添加兩個數組來創建一個數組

您可以通過使用添加運算符(+)添加具有兼容類型的兩個現有數組來創建新數組。新數組的類型是根據您添加在一起的兩個數組的類型推斷的:

  1. var anotherThreeDoubles = Array(repeating: 2.5, count: 3)

  2. // anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]

  3. var sixDoubles = threeDoubles + anotherThreeDoubles

  4. // sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

使用數組字面值創建數組

您還可以使用數組文本初始化數組,這是將一個或多個值作為數組集合寫入的簡寫方法。數組文字被寫為一列值,用逗號分隔,并由一對方括號包圍:

  • <pre class="code-voice" style="margin: 8px 0px; font-size: 0.85rem;">[ 值1值2值3 ]</pre>

下面的示例創建一個調用shoppingList以存儲String值的數組:

  1. var shoppingList: [String] = ["Eggs", "Milk"]
  2. // shoppingList has been initialized with two initial items

shoppingList變量被聲明為“字符串值的數組”,寫為[String]。由于此特定數組已指定值類型String,因此只允許存儲String值。在這里,shoppingList數組被初始化為兩個String值("Eggs""Milk"),寫入數組文字中。

注意

shoppingList數組被聲明為一個變量(與var介紹人),而不是一個常量(與let介紹人),因為更多的項目被添加到下面的例子中的購物清單。

在這種情況下,數組文字包含兩個String值,沒有別的。這與shoppingList變量聲明的類型(一個只能包含String值的數組)相匹配,因此允許使用數組文本的賦值作為初始化shoppingList兩個初始項的方法。

感謝Swift的類型推斷,如果使用包含相同類型值的數組字面值初始化數組,則不必編寫數組的類型。初始化shoppingList本來可以用較短的形式寫成:

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

因為數組文本中的所有值都是相同的類型,所以Swift可以推斷出這[String]是用于shoppingList變量的正確類型。

訪問和修改數組

您可以通過其方法和屬性或使用下標語法來訪問和修改數組。

要找出數組中項目的數量,請檢查其只讀count屬性:

  1. print("The shopping list contains \(shoppingList.count) items.")
  2. // Prints "The shopping list contains 2 items."

使用Boolean isEmpty屬性作為檢查count屬性是否等于的快捷方式0

  1. if shoppingList.isEmpty {
  2. print("The shopping list is empty.")
  3. } else {
  4. print("The shopping list is not empty.")
  5. }
  6. // Prints "The shopping list is not empty."

您可以通過調用數組的append(_:)方法將新項添加到數組的末尾:

  1. shoppingList.append("Flour")
  2. // shoppingList now contains 3 items, and someone is making pancakes

或者,使用添加賦值運算符(+=)添加一個或多個兼容項目的數組:

  1. shoppingList += ["Baking Powder"]
  2. // shoppingList now contains 4 items
  3. shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
  4. // shoppingList now contains 7 items

使用subscript語法從數組中檢索一個值,并在數組名稱后立即傳遞要檢索的方括號內的值的索引:

  1. var firstItem = shoppingList[0]
  2. // firstItem is equal to "Eggs"

注意

數組中的第一個項目的索引是0,而不是1。Swift中的數組始終為零索引。

您可以使用下標語法來更改給定索引處的現有值:

  1. shoppingList[0] = "Six eggs"
  2. // the first item in the list is now equal to "Six eggs" rather than "Eggs"

當使用下標語法時,您指定的索引需要有效。例如,編寫shoppingList[shoppingList.count] = "Salt"試圖將項添加到數組的末尾會導致運行時錯誤。

即使替換值的長度與要替換的范圍不同,您也可以使用下標語法一次更改一系列值。下面的示例替換"Chocolate Spread""Cheese"以及"Butter""Bananas""Apples"

  1. shoppingList[4...6] = ["Bananas", "Apples"]
  2. // shoppingList now contains 6 items

要將一個項目插入到指定索引處的數組中,請調用該數組的insert(_:at:)方法:

  1. shoppingList.insert("Maple Syrup", at: 0)
  2. // shoppingList now contains 7 items
  3. // "Maple Syrup" is now the first item in the list

這個insert(_:at:)方法的調用插入一個新的項目,其值為"Maple Syrup"購物清單的最開始處,由索引為0

同樣,您可以使用該remove(at:)方法從數組中移除一個項目。此方法刪除指定索引處的項目并返回刪除的項目(但如果不需要,您可以忽略返回的值):

  1. let mapleSyrup = shoppingList.remove(at: 0)
  2. // the item that was at index 0 has just been removed
  3. // shoppingList now contains 6 items, and no Maple Syrup
  4. // the mapleSyrup constant is now equal to the removed "Maple Syrup" string

注意

如果您嘗試訪問或修改數組現有邊界之外的索引的值,則會觸發運行時錯誤。通過將索引與數組的count屬性進行比較,可以檢查索引是否有效。數組中最大的有效索引是count - 1因為數組從零開始索引 - 但是,當countis 0(意味著數組為空)時,沒有有效的索引。

當一個項目被刪除時,數組中的任何間隙都會關閉,因此index 0處的值再次等于"Six eggs"

  1. firstItem = shoppingList[0]
  2. // firstItem is now equal to "Six eggs"

如果要從數組中移除最后一項,請使用removeLast()方法而不是remove(at:)方法來避免查詢數組的count屬性。像該remove(at:)方法一樣,removeLast()返回已刪除的項目:

  1. let apples = shoppingList.removeLast()
  2. // the last item in the array has just been removed
  3. // shoppingList now contains 5 items, and no apples
  4. // the apples constant is now equal to the removed "Apples" string

迭代數組

可以遍歷整個集合值與數組for- in循環:

  1. for item in shoppingList {
  2. print(item)
  3. }
  4. // Six eggs
  5. // Milk
  6. // Flour
  7. // Baking Powder
  8. // Bananas

如果您需要每個項目的整數索引及其值,請使用該enumerated()方法遍歷數組。對于數組中的每個項目,該enumerated()方法返回一個由整數和項目組成的元組。整數從零開始,每個項目加1; 如果您枚舉整個數組,這些整數與項目的索引匹配。作為迭代的一部分,您可以將元組分解為臨時常量或變量:

  1. for (index, value) in shoppingList.enumerated() {
  2. print("Item \(index + 1): \(value)")
  3. }
  4. // Item 1: Six eggs
  5. // Item 2: Milk
  6. // Item 3: Flour
  7. // Item 4: Baking Powder
  8. // Item 5: Bananas

有關for- in循環的更多信息,請參閱For-In循環

一個集合在同一個集合中存儲相同類型的不同值并且沒有定義的順序。當項目順序不重要時,或者需要確保項目只出現一次時,您可以使用一個集合而不是一個數組。

注意

斯威夫特的Set類型被橋接到基金會的NSSet班級。

有關使用的詳細信息Set與基金會和可可,看到與可可數據類型的工作使用斯威夫特與可可和Objective-C(雨燕4.1)

集合類型的哈希值

一個類型必須是可散列的才能存儲在一個集合中 - 也就是說,該類型必須提供一種為自己計算散列值的方法。哈希值是Int是對于同樣比較所有對象,例如,如果相同的值a == b,它遵循a.hashValue == b.hashValue

所有斯威夫特的基本類型(例如StringIntDouble,和Bool)默認情況下可哈希,并可以作為設定值類型或字典密鑰類型。沒有關聯值的枚舉大小寫值(如枚舉中所述)默認情況下也是可哈希的。

注意

您可以使用自己的自定義類型作為設置值類型或字典鍵類型,使其符合HashableSwift標準庫中的協議。符合Hashable協議的類型必須提供一個Int名為gettable的屬性hashValue。類型hashValue屬性返回的值不需要在同一程序的不同執行過程中或在不同的程序中相同。

由于Hashable協議符合Equatable,符合類型還必須提供equals運算符(==)的實現。該Equatable協議要求任何符合實現==的等價關系。也就是說,一個實現==必須滿足以下三個條件,所有值ab以及c

  • a == a (自反)

  • a == b暗示b == a(對稱)

  • a == b && b == c意味著a == c(傳遞性)

有關符合協議的更多信息,請參閱協議

設置類型語法

Swift集合的類型被寫為Set<Element>Element集合允許存儲的類型在哪里。與數組不同,集合不具有等效的速記形式。

創建并初始化一個空集

您可以使用初始化語法創建一個特定類型的空集:

  1. var letters = Set<Character>()
  2. print("letters is of type Set<Character> with \(letters.count) items.")
  3. // Prints "letters is of type Set<Character> with 0 items."

注意

根據初始值設定項的類型letters推斷變量Set<Character>的類型是。

或者,如果上下文已經提供了類型信息,例如函數參數或已經存在類型的變量或常量,則可以使用空數組文本創建一個空集:

  1. letters.insert("a")
  2. // letters now contains 1 value of type Character
  3. letters = []
  4. // letters is now an empty set, but is still of type Set<Character>

使用數組文字創建一個集合

您還可以使用數組文本初始化一個集合,作為將一個或多個值作為集合集合寫入的簡寫方法。

下面的示例創建一個調用favoriteGenres存儲String值的集合:

  1. var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
  2. // favoriteGenres has been initialized with three initial items

favoriteGenres變量被聲明為“一組String值”,寫為Set<String>。因為這個特定的集合已經指定了一個值類型String,所以允許存儲String值。在此,favoriteGenres集合被初始化具有三個String值("Rock""Classical",和"Hip hop"),陣列字面內寫入。

注意

favoriteGenres集被聲明為一個變量(與var介紹人),而不是一個常量(與let介紹人),因為在下面的例子中添加和刪除了項目。

集合類型不能單獨從數組文本中推斷出來,所以Set必須明確聲明類型。但是,由于Swift的類型推斷,如果使用包含相同類型值的數組字面值初始化它,則不必編寫該類型的集合。初始化favoriteGenres本來可以用較短的形式寫成:

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

因為數組文本中的所有值都是相同的類型,所以Swift可以推斷出這Set<String>是用于favoriteGenres變量的正確類型。

訪問和修改集合

你可以通過它的方法和屬性來訪問和修改一個集合。

要找出一組中的項目數量,請檢查其只讀count屬性:

  1. print("I have \(favoriteGenres.count) favorite music genres.")
  2. // Prints "I have 3 favorite music genres."

使用Boolean isEmpty屬性作為檢查count屬性是否等于的快捷方式0

  1. if favoriteGenres.isEmpty {
  2. print("As far as music goes, I'm not picky.")
  3. } else {
  4. print("I have particular music preferences.")
  5. }
  6. // Prints "I have particular music preferences."

您可以通過調用set的insert(_:)方法將新項目添加到集合中:

  1. favoriteGenres.insert("Jazz")
  2. // favoriteGenres now contains 4 items

您可以通過調用set的remove(_:)方法從集合中刪除一個項目,如果該項目是該集合的成員,則該項目將移除該項目,并返回已移除的值; nil如果該集合未包含該項目,則返回該值。或者,可以使用其removeAll()方法刪除集合中的所有項目。

  1. if let removedGenre = favoriteGenres.remove("Rock") {
  2. print("\(removedGenre)? I'm over it.")
  3. } else {
  4. print("I never much cared for that.")
  5. }
  6. // Prints "Rock? I'm over it."

要檢查一個集合是否包含特定項目,請使用該contains(_:)方法。

  1. if favoriteGenres.contains("Funk") {
  2. print("I get up on the good foot.")
  3. } else {
  4. print("It's too funky in here.")
  5. }
  6. // Prints "It's too funky in here."

迭代集合

您可以使用for- in循環遍歷集合中的值。

  1. for genre in favoriteGenres {
  2. print("\(genre)")
  3. }
  4. // Jazz
  5. // Hip hop
  6. // Classical

有關for- in循環的更多信息,請參閱For-In循環

Swift的Set類型沒有定義的順序。要按特定順序迭代集合的值,請使用該sorted()方法,該方法將集合的元素作為使用<運算符排序的數組返回。

  1. for genre in favoriteGenres.sorted() {
  2. print("\(genre)")
  3. }
  4. // Classical
  5. // Hip hop
  6. // Jazz

執行集合操作

您可以高效地執行基本集合操作,例如將兩個集合組合在一起,確定兩個集合具有哪些值,或確定兩個集合是包含全部,部分還是不包含相同的值。

基本設置操作

下圖描繪了兩個集- ab-附由陰影區域表示的各種設定操作的結果。

<figure class="figure" style="font-size: 0.8rem;">[圖片上傳失敗...(image-f83059-1531103372853)]

</figure>

  • 使用該intersection(_:)方法創建一個僅具有兩個集合通用值的新集合。

  • 使用該symmetricDifference(_:)方法創建一個新的集合,其中任何一個集合中都有值,但不能同時包含兩個值

  • 使用該union(_:)方法創建一個包含兩個集合中所有值的新集合。

  • 使用該subtracting(_:)方法創建一個新的集合,其值不在指定的集合中。

  1. let oddDigits: Set = [1, 3, 5, 7, 9]

  2. let evenDigits: Set = [0, 2, 4, 6, 8]

  3. let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]

  4. oddDigits.union(evenDigits).sorted()

  5. // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  6. oddDigits.intersection(evenDigits).sorted()

  7. // []

  8. oddDigits.subtracting(singleDigitPrimeNumbers).sorted()

  9. // [1, 9]

  10. oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()

  11. // [1, 2, 9]

設置成員資格和平等

下面的插圖描述了三個集合ab以及c表示在集合之間共享元素的重疊區域。Set a集合的超b,因為a包含了所有元素b。相反,set b是集合的一個a,因為所有元素b都包含在內a。Set b和Set c是彼此分離的,因為它們沒有共同的元素。

<figure class="figure" style="font-size: 0.8rem;">[圖片上傳失敗...(image-b5bc-1531103372853)]

</figure>

  • 使用“is equal”運算符(==)來確定兩個集合是否包含所有相同的值。

  • 使用該isSubset(of:)方法確定一個集合的所有值是否都包含在指定的集合中。

  • 使用該isSuperset(of:)方法來確定一個集合是否包含指定集合中的所有值。

  • 使用isStrictSubset(of:)or isStrictSuperset(of:)方法來確定一個集合是一個子集或超集,但不等于一個指定的集合。

  • 使用該isDisjoint(with:)方法確定兩個集合是否沒有共同的值。

  1. let houseAnimals: Set = ["??", "??"]

  2. let farmAnimals: Set = ["??", "??", "??", "??", "??"]

  3. let cityAnimals: Set = ["??", "??"]

  4. houseAnimals.isSubset(of: farmAnimals)

  5. // true

  6. farmAnimals.isSuperset(of: houseAnimals)

  7. // true

  8. farmAnimals.isDisjoint(with: cityAnimals)

  9. // true

字典

字典存儲相同類型的密鑰和一個集合中的相同類型的值與沒有定義排序之間的關聯。每個值都與一個唯一相關聯,該用作字典中該值的標識符。與數組中的項目不同,字典中的項目沒有指定的順序。當需要根據標識符查找值時,您可以使用字典,這與使用真實世界字典查找特定字詞的定義的方式大致相同。

注意

斯威夫特的Dictionary類型被橋接到基金會的NSDictionary班級。

有關使用的詳細信息Dictionary與基金會和可可,看到與可可數據類型的工作使用斯威夫特與可可和Objective-C(雨燕4.1)

字典類型速記語法

Swift字典的類型完全寫成Dictionary<Key, Value>,其中Key是可以用作字典鍵Value的值的類型,并且是字典為這些鍵存儲的值的類型。

注意

字典Key類型必須符合Hashable協議,就像集合的值類型一樣。

您也可以用簡寫形式書寫字典的類型[Key: Value]。盡管這兩種形式在功能上是相同的,但是在引用字典類型時,縮寫形式是優選的,并且貫穿本指南。

創建一個空字典

與數組一樣,您可以Dictionary使用初始化語法創建一個空的某種類型:

  1. var namesOfIntegers = [Int: String]()
  2. // namesOfIntegers is an empty [Int: String] dictionary

這個例子創建一個空的字典類型[Int: String]來存儲可讀的整數值名稱。它的鍵是類型的Int,它的值是類型的String

如果上下文已經提供了類型信息,則可以創建一個空字典,其中包含一個空字典文字,該文字被寫為[:](一對方括號內的冒號):

  1. namesOfIntegers[16] = "sixteen"
  2. // namesOfIntegers now contains 1 key-value pair
  3. namesOfIntegers = [:]
  4. // namesOfIntegers is once again an empty dictionary of type [Int: String]

使用字典文字創建字典

您還可以使用字典文字來初始化字典,它具有與前面所看到的數組字面相似的語法。字典文字是將一個或多個鍵值對寫入Dictionary集合的簡寫方法。

鍵值對是一個鍵和值的組合。在字典文字中,每個鍵 - 值對中的鍵和值由冒號分隔。鍵值對寫成一個列表,用逗號分隔,并用一對方括號包圍:

  • <pre class="code-voice" style="margin: 8px 0px; font-size: 0.85rem;">[ 鍵1值1鍵2值2鍵3值3 ]</pre>

下面的示例創建一個字典來存儲國際機場的名稱。在這本詞典中,關鍵字是三個字母的國際航空運輸協會代碼,其值是機場名稱:

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

airports字典被聲明為具有式的[String: String],意思是“一Dictionary鍵均為類型的String,并且其值是類型的也String”。

注意

airports字典被聲明為一個變量(與var導引器),而不是一個常數(與let導引器),因為更多的機場被添加到詞典中下面的例子。

airports字典被初始化與含有兩個鍵-值對的字典字面值。第一對有一個鍵"YYZ"和一個值"Toronto Pearson"。第二對有一個鍵"DUB"和一個值"Dublin"

這個字典文字包含兩String: String對。這個鍵值類型與airports變量聲明的類型相匹配(只有String鍵和只有String值的詞典),因此字典文本的賦值可以用來初始化airports帶有兩個初始化項的字典。

與數組一樣,如果使用鍵和值具有一致類型的字典文字進行初始化,則不必編寫字典的類型。初始化airports本來可以用較短的形式寫成:

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

由于文本中的所有鍵都是彼此相同的類型,并且同樣所有的值都是相同類型的,所以Swift可以推斷出這[String: String]是用于airports字典的正確類型。

訪問和修改字典

您可以通過其方法和屬性或使用下標語法來訪問和修改字典。

與數組一樣,您可以Dictionary通過檢查其只讀count屬性來找出a中的項目數量:

  1. print("The airports dictionary contains \(airports.count) items.")
  2. // Prints "The airports dictionary contains 2 items."

使用Boolean isEmpty屬性作為檢查count屬性是否等于的快捷方式0

  1. if airports.isEmpty {
  2. print("The airports dictionary is empty.")
  3. } else {
  4. print("The airports dictionary is not empty.")
  5. }
  6. // Prints "The airports dictionary is not empty."

您可以使用下標語法將新項目添加到字典中。使用適當類型的新鍵作為下標索引,并分配適當類型的新值:

  1. airports["LHR"] = "London"
  2. // the airports dictionary now contains 3 items

您還可以使用下標語法來更改與特定鍵關聯的值:

  1. airports["LHR"] = "London Heathrow"
  2. // the value for "LHR" has been changed to "London Heathrow"

作為下標的替代updateValue(_:forKey:)方法,使用字典的方法來設置或更新特定鍵的值。就像上面的下標示例一樣,updateValue(_:forKey:)如果某個鍵不存在,該方法將為該鍵設置一個值,如果該鍵已經存在,該方法將更新該值。然而,與下標不同的是,該updateValue(_:forKey:)方法在執行更新后返回值。這使您可以檢查是否發生更新。

updateValue(_:forKey:)方法返回字典值類型的可選值。例如,對于存儲String值的字典,該方法返回一個類型值String?,或“可選String”。如果更新前存在該值,則此可選值包含該值的舊值,或者nil沒有值:

  1. if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
  2. print("The old value for DUB was \(oldValue).")
  3. }
  4. // Prints "The old value for DUB was Dublin."

您還可以使用下標語法從字典中檢索特定鍵的值。因為可以請求不存在值的鍵,所以字典的下標返回字典值類型的可選值。如果字典包含請求鍵的值,則下標返回包含該鍵現有值的可選值。否則,下標返回nil

  1. if let airportName = airports["DUB"] {
  2. print("The name of the airport is \(airportName).")
  3. } else {
  4. print("That airport is not in the airports dictionary.")
  5. }
  6. // Prints "The name of the airport is Dublin Airport."

您可以使用下標語法通過指定該鍵的值來從字典中刪除鍵值對nil

  1. airports["APL"] = "Apple International"
  2. // "Apple International" is not the real airport for APL, so delete it
  3. airports["APL"] = nil
  4. // APL has now been removed from the dictionary

或者,使用該removeValue(forKey:)方法從字典中移除鍵值對。如果鍵值對存在并返回已除去的值,則該方法將移除鍵值對,nil如果沒有值,則返回該值:

  1. if let removedValue = airports.removeValue(forKey: "DUB") {
  2. print("The removed airport's name is \(removedValue).")
  3. } else {
  4. print("The airports dictionary does not contain a value for DUB.")
  5. }
  6. // Prints "The removed airport's name is Dublin Airport."

迭代字典

您可以用字典遍歷鍵值對for- in環。字典中的每一項都作為(key, value)元組返回,并且可以將元組的成員分解為臨時常量或變量,作為迭代的一部分:

  1. for (airportCode, airportName) in airports {
  2. print("\(airportCode): \(airportName)")
  3. }
  4. // YYZ: Toronto Pearson
  5. // LHR: London Heathrow

有關for- in循環的更多信息,請參閱For-In循環

您還可以通過訪問其屬性keysvalues屬性來檢索字典鍵或值的可迭代集合:

  1. for airportCode in airports.keys {

  2. print("Airport code: \(airportCode)")

  3. }

  4. // Airport code: YYZ

  5. // Airport code: LHR

  6. for airportName in airports.values {

  7. print("Airport name: \(airportName)")

  8. }

  9. // Airport name: Toronto Pearson

  10. // Airport name: London Heathrow

如果您需要使用帶有Array實例的API的字典鍵或值,請使用keysvalues屬性初始化新數組:

  1. let airportCodes = [String](airports.keys)

  2. // airportCodes is ["YYZ", "LHR"]

  3. let airportNames = [String](airports.values)

  4. // airportNames is ["Toronto Pearson", "London Heathrow"]

Swift的Dictionary類型沒有定義的順序。要按特定順序遍歷字典的鍵或值,請sorted()在其keysvalues屬性上使用該方法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378