Swift提供了三種主要的集合類(lèi)型,array數(shù)組, set集合, dictionary字典,用于存儲(chǔ)值集合。
數(shù)組array是值的有序集合。
集合set是惟一值的無(wú)序集合。
字典dictionary是鍵值關(guān)聯(lián)的無(wú)序集合。

Swift中的數(shù)組、集合和字典總是清楚地知道它們可以存儲(chǔ)的值和鍵的類(lèi)型。這意味著不能錯(cuò)誤地將錯(cuò)誤類(lèi)型的值插入集合。這還意味著您可以確定從集合中檢索的值的類(lèi)型。
Mutability of Collections 可變性
如果創(chuàng)建數(shù)組、集合或字典,并將其分配給變量,則所創(chuàng)建的集合將是可變的。這意味著,通過(guò)添加、刪除或更改集合中的項(xiàng),可以在創(chuàng)建集合之后更改(或修改)集合。如果將數(shù)組、集合或字典賦給常量,則該集合是不可變的,且其大小和內(nèi)容不能更改。
注意:在集合不需要更改的所有情況下,創(chuàng)建不可變集合是一個(gè)很好的實(shí)踐。這樣做使您更容易推斷代碼,并使Swift編譯器能夠優(yōu)化您創(chuàng)建的集合的性能。
Arrays 數(shù)組
數(shù)組在有序列表中存儲(chǔ)相同類(lèi)型的值。相同的值可以在數(shù)組的不同位置多次出現(xiàn)。
Array Type Shorthand Syntax 數(shù)組類(lèi)型簡(jiǎn)寫(xiě)語(yǔ)法
Swift數(shù)組的類(lèi)型被完整地寫(xiě)成array ,其中Element是數(shù)組允許存儲(chǔ)的值的類(lèi)型。您還可以將數(shù)組的類(lèi)型以簡(jiǎn)寫(xiě)形式寫(xiě)成[Element]。雖然這兩種形式在功能上是相同的,但是在整個(gè)教程指南中,當(dāng)引用數(shù)組的類(lèi)型時(shí),首選使用簡(jiǎn)寫(xiě)形式。
Creating an Empty Array 創(chuàng)建一個(gè)空數(shù)組
可以使用初始化器語(yǔ)法創(chuàng)建特定類(lèi)型的空數(shù)組:
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// Prints "someInts is of type [Int] with 0 items."
注意someInts變量的類(lèi)型從初始化器的類(lèi)型推斷為[Int]。
或者,如果上下文已經(jīng)提供了類(lèi)型信息,例如函數(shù)參數(shù)或已經(jīng)類(lèi)型化的變量或常量,您可以使用一個(gè)空數(shù)組文字創(chuàng)建一個(gè)空數(shù)組,它被寫(xiě)成:
someInts.append(3)
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]
Creating an Array with a Default Value 創(chuàng)建具有默認(rèn)值的數(shù)組
Swift的數(shù)組類(lèi)型還提供了一個(gè)初始化器,用于創(chuàng)建一個(gè)特定大小的數(shù)組,其所有值都設(shè)置為相同的默認(rèn)值。傳遞給初始化器一個(gè)適當(dāng)類(lèi)型的默認(rèn)值(稱為repeat):該值在新數(shù)組中重復(fù)的次數(shù)(稱為count):
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
Creating an Array by Adding Two Arrays Together 通過(guò)兩個(gè)數(shù)組加起來(lái)創(chuàng)建新數(shù)組
通過(guò)使用加法運(yùn)算符(+)將兩個(gè)具有兼容類(lèi)型的現(xiàn)有數(shù)組相加,可以創(chuàng)建一個(gè)新數(shù)組。新數(shù)組的類(lèi)型是從兩個(gè)相加數(shù)組的類(lèi)型推斷出來(lái)的:
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
Creating an Array with an Array Literal 使用數(shù)組字面量創(chuàng)建數(shù)組
您還可以使用數(shù)組文字初始化數(shù)組,這是將一個(gè)或多個(gè)值編寫(xiě)為數(shù)組集合的一種簡(jiǎn)寫(xiě)方法。數(shù)組文字被寫(xiě)成一列值,用逗號(hào)分隔,用一對(duì)方括號(hào)括起來(lái):
[value1, value2, value3]
下面的例子創(chuàng)建了一個(gè)名為shoppingList的數(shù)組來(lái)存儲(chǔ)字符串值:
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items
shoppingList變量被聲明為“字符串值的數(shù)組”,被寫(xiě)成[string]。因?yàn)檫@個(gè)特定的數(shù)組指定了字符串的值類(lèi)型,所以它只允許存儲(chǔ)字符串值。在這里,shoppingList數(shù)組用兩個(gè)字符串值(“Eggs”和“Milk”)初始化,并在數(shù)組文本中編寫(xiě)。
shoppingList數(shù)組被聲明為一個(gè)變量(使用var導(dǎo)入器),而不是一個(gè)常量(使用let導(dǎo)入器),因?yàn)樵谙旅娴氖纠?,更多的商品被添加到?gòu)物列表中。
在本例中,數(shù)組文字只包含兩個(gè)字符串值。這與shoppingList變量的聲明類(lèi)型相匹配(一個(gè)數(shù)組只能包含字符串值),因此數(shù)組文字的賦值被允許作為用兩個(gè)初始項(xiàng)初始化shoppingList的方法。
由于Swift的類(lèi)型推斷,如果使用包含相同類(lèi)型值的數(shù)組文字初始化數(shù)組,則不必編寫(xiě)數(shù)組的類(lèi)型。shoppingList的初始化可以寫(xiě)成更短的形式:
var shoppingList = ["Eggs", "Milk"]
因?yàn)閿?shù)組文字中的所有值都是同一類(lèi)型的,Swift可以推斷[String]是shoppingList變量的正確類(lèi)型。
Accessing and Modifying an Array 訪問(wèn)和修改數(shù)組
您可以通過(guò)數(shù)組的方法和屬性或使用下標(biāo)語(yǔ)法訪問(wèn)和修改數(shù)組。
若要查明數(shù)組中的項(xiàng)數(shù),請(qǐng)檢查其只讀計(jì)數(shù)屬性:
print("The shopping list contains \(shoppingList.count) items.")
// Prints "The shopping list contains 2 items."
使用Boolean isEmpty屬性作為檢查count屬性是否等于0的快捷方式:
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// Prints "The shopping list is not empty."
您可以通過(guò)調(diào)用數(shù)組的append(_:)方法將新項(xiàng)添加到數(shù)組的末尾:
shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes
也可以使用 += 運(yùn)算符:
shoppingList += ["Baking Powder"]
// shoppingList now contains 4 items
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList now contains 7 items
使用下標(biāo)語(yǔ)法從數(shù)組中檢索一個(gè)值,在數(shù)組名稱之后立即在方括號(hào)中傳遞要檢索的值的索引:
var firstItem = shoppingList[0]
// firstItem is equal to "Eggs"
注意:數(shù)組中的第一項(xiàng)索引為0,而不是1。Swift中的數(shù)組總是零索引的。
可以使用下標(biāo)語(yǔ)法在給定索引處更改現(xiàn)有值:
shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs"
使用下標(biāo)語(yǔ)法時(shí),指定的索引必須有效。例如,編寫(xiě)shoppingList[shoppingList.count] = "Salt"嘗試將一個(gè)項(xiàng)追加到數(shù)組末尾會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。
您還可以使用下標(biāo)語(yǔ)法立即更改一個(gè)值范圍,即使替換值集的長(zhǎng)度與要替換的范圍不同。下面的例子用“香蕉”和“蘋(píng)果”代替“巧克力醬”、“奶酪”和“黃油”:
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items
這里是將4-6三個(gè)元素替換成2個(gè)元素了
若要在指定索引處將項(xiàng)插入數(shù)組,請(qǐng)調(diào)用數(shù)組的insert(_:at:)方法:
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list
類(lèi)似地,使用remove(at:)方法從數(shù)組中刪除項(xiàng)。此方法刪除指定索引處的項(xiàng)并返回已刪除的項(xiàng)(如果不需要,可以忽略返回值):
let mapleSyrup = shoppingList.remove(at: 0)
注意:如果試圖訪問(wèn)或修改超出數(shù)組現(xiàn)有邊界的索引值,則會(huì)觸發(fā)運(yùn)行時(shí)錯(cuò)誤。通過(guò)將索引與數(shù)組的count屬性進(jìn)行比較,可以在使用索引之前檢查索引是否有效。數(shù)組中最大的有效索引是count - 1,因?yàn)閿?shù)組是從0開(kāi)始索引的。
如果希望從數(shù)組中刪除最后一項(xiàng),請(qǐng)使用removeLast()方法而不是remove(at:)方法,以避免查詢數(shù)組的count屬性。與remove(at:)方法類(lèi)似,removeLast()返回已刪除的項(xiàng):
let apples = shoppingList.removeLast()
Iterating Over an Array 遍歷數(shù)組
你可以用for-in循環(huán)遍歷數(shù)組中的所有值:
for item in shoppingList {
print(item)
}
如果需要每個(gè)項(xiàng)的整數(shù)索引及其值,則使用枚舉()方法迭代數(shù)組。對(duì)于數(shù)組中的每個(gè)項(xiàng),枚舉()方法返回一個(gè)由整數(shù)和項(xiàng)組成的元組。整數(shù)從0開(kāi)始,每一項(xiàng)加1;如果枚舉整個(gè)數(shù)組,這些整數(shù)匹配項(xiàng)的索引。您可以將元組分解為臨時(shí)常量或變量作為迭代的一部分:
for (index, value) in shoppingList.enumerated() {
print("Item \(index + 1): \(value)")
}
Sets 集合
集合在沒(méi)有定義順序的集合中存儲(chǔ)同一類(lèi)型的不同值。
當(dāng)項(xiàng)的順序不重要時(shí),或者需要確保項(xiàng)只出現(xiàn)一次時(shí),可以使用集合而不是數(shù)組。
Hash Values for Set Types set類(lèi)型的哈希值
一種類(lèi)型必須是可hashable的,以便存儲(chǔ)在一個(gè)集合中——也就是說(shuō),類(lèi)型必須提供一種為自己計(jì)算哈希值的方法。哈希值是一個(gè)Int值,它對(duì)于所有比較相同的對(duì)象都是相同的,因此,如果a == b,那么它就遵循a.hashValue = = b.hashValue。
Swift的所有基本類(lèi)型(如String、Int、Double和Bool)在默認(rèn)情況下都是可hashable的,可以用作set value類(lèi)型或dictionary key類(lèi)型。沒(méi)有關(guān)聯(lián)值的枚舉用例值(如枚舉中所述)在默認(rèn)情況下也是可hashable的。
您可以使用自己的自定義類(lèi)型作為set value類(lèi)型或dictionary key類(lèi)型,方法是使它們符合Swift標(biāo)準(zhǔn)庫(kù)中的Hashable協(xié)議。符合Hashable協(xié)議的類(lèi)型必須提供一個(gè)名為hashValue的可獲取Int屬性。類(lèi)型的hashValue屬性返回的值在同一程序的不同執(zhí)行或不同程序中不需要相同。
因?yàn)镠ashable協(xié)議符合Equatable,符合Equatable的類(lèi)型還必須提供equals操作符(==)的實(shí)現(xiàn)。Equatable協(xié)議要求任何符合==的實(shí)現(xiàn)都是等價(jià)關(guān)系。也就是說(shuō),對(duì)于所有值a、b和c, ==的實(shí)現(xiàn)必須滿足以下三個(gè)條件:
- a == a (Reflexivity)
- a == b implies b == a (Symmetry)
- a == b && b == c implies a == c (Transitivity)
Set Type Syntax set類(lèi)型語(yǔ)法
Swift集合的類(lèi)型被寫(xiě)成set ,其中Element是允許該集合存儲(chǔ)的類(lèi)型。與數(shù)組不同,集合沒(méi)有等價(jià)的簡(jiǎn)寫(xiě)形式。
Creating and Initializing an Empty Set 創(chuàng)建和初始化空集合set
創(chuàng)建一個(gè)元素類(lèi)型的為Character 的空集合:
var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// Prints "letters is of type Set<Character> with 0 items."
或者,如果上下文已經(jīng)提供了類(lèi)型信息,例如函數(shù)參數(shù)或已經(jīng)類(lèi)型化的變量或常量,則可以使用空數(shù)組文字創(chuàng)建一個(gè)空集:
letters.insert("a")
// letters now contains 1 value of type Character
letters = []
// letters is now an empty set, but is still of type Set<Character>
Creating a Set with an Array Literal 使用數(shù)組創(chuàng)建集合set
您還可以使用數(shù)組文字初始化一個(gè)集合,作為將一個(gè)或多個(gè)值寫(xiě)入集合的簡(jiǎn)寫(xiě)方法。
下面的例子創(chuàng)建了一個(gè)名為favoritegenre的集合來(lái)存儲(chǔ)字符串值:
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres has been initialized with three initial items
指定了set集合中存儲(chǔ)類(lèi)型為String
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
Swift 可以類(lèi)型推斷
Accessing and Modifying a Set 訪問(wèn)和修改set
您可以通過(guò)它的方法和屬性訪問(wèn)和修改一個(gè)集合。
元素個(gè)數(shù)
print("I have \(favoriteGenres.count) favorite music genres.")
// Prints "I have 3 favorite music genres."
是否為空
if favoriteGenres.isEmpty {
print("As far as music goes, I'm not picky.")
} else {
print("I have particular music preferences.")
}
插入一個(gè)新元素
favoriteGenres.insert("Jazz")
移除元素
移除單個(gè)元素 如果集合中有改元素,返回該元素,沒(méi)有返回nil
if let removedGenre = favoriteGenres.remove("Rock") {
print("\(removedGenre)? I'm over it.")
} else {
print("I never much cared for that.")
}
// Prints "Rock? I'm over it."
移除所有元素
favoriteGenres.removeAll()
是否包含某個(gè)元素
if favoriteGenres.contains("Funk") {
print("I get up on the good foot.")
} else {
print("It's too funky in here.")
}
遍歷set集合
可以使用for-in遍歷set集合
for genre in favoriteGenres {
print("\(genre)")
}
Swift的Set類(lèi)型沒(méi)有定義順序。要按特定順序遍歷集合的值,可以使用ordered()方法,該方法將集合的元素作為使用<操作符排序的數(shù)組返回。
for genre in favoriteGenres.sorted() {
print("\(genre)")
}
Performing Set Operations 執(zhí)行set操作
您可以有效地執(zhí)行基本的集合操作,例如將兩個(gè)集合組合在一起,確定兩個(gè)集合有哪些值相同,或者確定兩個(gè)集合是否包含所有、一些或沒(méi)有相同的值。
Fundamental Set Operations 基本設(shè)置操作
下圖描述了兩個(gè)集合—a和b—以及用陰影區(qū)域表示的各種集合操作的結(jié)果。

- 使用 intersection(_:) 方法獲取兩個(gè)集合相同的部分
- 使用symmetricDifference(_:) 方法獲取兩個(gè)集合不相同的部分
- 使用 union(_:) 方法獲取兩個(gè)集合的所有元素
- 使用 subtracting(_:) 方法獲取與當(dāng)前集合減去相同元素的部分
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
Set Membership and Equality set成員關(guān)系和相等
下圖描述了三個(gè)集合a、b和c,其中重疊的區(qū)域表示集合之間共享的元素。設(shè)置一個(gè)是集的超集b,因?yàn)榘怂性豣。相反地,b是集的一個(gè)子集,因?yàn)樗性豣也包含一組。b, c是不相交的,因?yàn)樗麄儧](méi)有共同之處。

- 使用 == 確定兩個(gè)set集合中元素是否完全相同。
是返回true,否則返回false - 使用 isSubset(of:) 方法確定當(dāng)前集合是否是另一個(gè)集合的子集(當(dāng)前集合的所有元素在另一個(gè)集合中都可以找到)。
是返回true,否則返回false - 使用 isSuperset(of:) 方法 確定當(dāng)前集合是否是另一個(gè)集合的超集(當(dāng)前集合中可以找到另一個(gè)集合的所有元素)。
是返回true,否則返回false - 使用 isStrictSubset(of:) 方法來(lái)確定當(dāng)前集合是否是另一個(gè)集合的真子集(是子集且不完全相等)。
是返回true,否則返回false - 使用 isStrictSuperset(of:) 方法來(lái)確定當(dāng)前集合是否是另一個(gè)集合的真超集(是超集且不完全相等)。
是返回true,否則返回false - 使用 isDisjoint(with:) 方法來(lái)確定兩個(gè)集合是否沒(méi)有共同的元素。
有相同元素返回false,沒(méi)有返回true
let houseAnimals: Set = ["??", "??"]
let farmAnimals: Set = ["??", "??", "??", "??", "??"]
let cityAnimals: Set = ["??", "??"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true
Dictionary 字典
字典在沒(méi)有定義順序的集合中存儲(chǔ)相同類(lèi)型的鍵和相同類(lèi)型的值之間的關(guān)聯(lián)。
每個(gè)value都與一個(gè)惟一的key相關(guān)聯(lián),該key在字典中充當(dāng)該value的標(biāo)識(shí)符。
與數(shù)組中的item不同,字典中的item沒(méi)有指定的順序。
當(dāng)您需要根據(jù)值的標(biāo)識(shí)符查找值時(shí),您將使用字典,這與實(shí)際字典用于查找特定單詞的定義非常相似。
Dictionary Type Shorthand Syntax 字典簡(jiǎn)寫(xiě)語(yǔ)法
Swift字典的類(lèi)型完整地寫(xiě)成Dictionary<Key,Value> ,其中Key是字典中每項(xiàng)標(biāo)識(shí)符值的類(lèi)型,Value是字典為這些鍵存儲(chǔ)的值的類(lèi)型。
注意:字典的鍵類(lèi)型必須符合Hashable協(xié)議,就像集合的值類(lèi)型一樣。
您還可以將字典的類(lèi)型以簡(jiǎn)寫(xiě)形式寫(xiě)成[Key: Value]。雖然這兩種形式在功能上是相同的,但是在本指南中,在引用字典的類(lèi)型時(shí),首選使用速記形式。
Creating an Empty Dictionary 創(chuàng)建一個(gè)空字典
var namesOfIntegers = [Int: String]()
// namesOfIntegers is an empty [Int: String] dictionary
這個(gè)例子創(chuàng)建了一個(gè)類(lèi)型為[Int: String]的空字典來(lái)存儲(chǔ)人類(lèi)可讀的整數(shù)值名稱。它的鍵類(lèi)型為Int,值類(lèi)型為String。
如果上下文已經(jīng)提供了類(lèi)型信息,您可以使用一個(gè)空字典文本創(chuàng)建一個(gè)空字典,它被寫(xiě)成 [:]
namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type [Int: String]
使用字典字面量創(chuàng)建字典
您還可以使用字典字面量初始化字典,它的語(yǔ)法與前面看到的數(shù)組字面量類(lèi)似。dictionary literal是將一個(gè)或多個(gè)鍵值對(duì)編寫(xiě)為dictionary集合的一種簡(jiǎn)寫(xiě)方法。
鍵值對(duì)是鍵和值的組合。在字典文本中,每個(gè)鍵值對(duì)中的鍵和值之間用冒號(hào)分隔。鍵值對(duì)以列表形式編寫(xiě),用逗號(hào)分隔,用一對(duì)方括號(hào)括起來(lái):
[key1: value1, key2: value2, key3: value3]
下面的示例創(chuàng)建一個(gè)字典來(lái)存儲(chǔ)國(guó)際機(jī)場(chǎng)的名稱。在本詞典中,鍵為三個(gè)字母的國(guó)際航空運(yùn)輸協(xié)會(huì)代碼,值為機(jī)場(chǎng)名稱:
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
機(jī)場(chǎng)字典聲明為具有[String: String]類(lèi)型,這意味著“其鍵為String類(lèi)型的字典,其值也為String類(lèi)型的字典”。
機(jī)場(chǎng)字典被聲明為一個(gè)變量(使用var關(guān)鍵字),而不是一個(gè)常量(使用let關(guān)鍵字),因?yàn)樵谙旅娴氖纠?,更多的機(jī)場(chǎng)被添加到字典中。
機(jī)場(chǎng)字典是用包含兩個(gè)鍵值對(duì)的字典文本初始化的。第一對(duì)的鍵是“YYZ”,值是“Toronto Pearson”。第二對(duì)鍵值為“DUB”,值為“Dublin”。
這個(gè)字典文本包含兩個(gè)字符串:字符串對(duì)。此鍵-值類(lèi)型與機(jī)場(chǎng)變量聲明的類(lèi)型相匹配(只有字符串鍵和字符串值的字典),因此允許分配字典字面量,以便使用兩個(gè)初始項(xiàng)初始化機(jī)場(chǎng)字典。
與數(shù)組一樣,如果要用一個(gè)字典字面量初始化字典,而字典字面量的鍵和值具有一致的類(lèi)型,則不必編寫(xiě)字典的類(lèi)型。機(jī)場(chǎng)的初始化可以寫(xiě)成更短的形式:
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
因?yàn)槲淖种械乃墟I都是彼此相同的類(lèi)型,同樣,所有值都是彼此相同的類(lèi)型,所以Swift可以推斷[String: String]是機(jī)場(chǎng)字典使用的正確類(lèi)型。
Accessing and Modifying a Dictionary 訪問(wèn)和修改字典
您可以通過(guò)字典的方法和屬性,或者使用下標(biāo)語(yǔ)法來(lái)訪問(wèn)和修改字典。
與數(shù)組一樣,您可以通過(guò)檢查字典的只讀count屬性來(lái)查找字典中的項(xiàng)數(shù):
print(airports.count)
輸出2
判斷是否為空字典
if airports.isEmpty {
print("The airports dictionary is empty.")
} else {
print("The airports dictionary is not empty.")
}
可以使用下標(biāo)語(yǔ)法將新項(xiàng)添加到字典中。使用適當(dāng)類(lèi)型的新鍵作為下標(biāo)索引,并分配適當(dāng)類(lèi)型的新值:
airports["LHR"] = "London"
您還可以使用下標(biāo)語(yǔ)法來(lái)更改與特定鍵關(guān)聯(lián)的值:
airports["LHR"] = "London Heathrow"
作為下標(biāo)的替代方法,使用字典的updateValue(:forKey:)方法來(lái)設(shè)置或更新特定鍵的值。與上面的下標(biāo)示例一樣,updateValue(:forKey:)方法在一個(gè)鍵不存在的情況下為該鍵設(shè)置一個(gè)值,或者在該鍵已經(jīng)存在的情況下更新該值。但是,與下標(biāo)不同,updateValue(_:forKey:)方法在執(zhí)行更新后返回舊值。這使您能夠檢查是否發(fā)生了更新。
updateValue(_:forKey:) 方法的作用是:返回值為可選類(lèi)型,因?yàn)閗ey可能存在,可能不存在,存在返回key所對(duì)應(yīng)的舊值,不存在就返回nil
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
print("The old value for DUB was \(oldValue).")
}
// Prints "The old value for DUB was Dublin."
還可以使用下標(biāo)語(yǔ)法從字典中檢索特定鍵的值。因?yàn)榭梢哉?qǐng)求一個(gè)沒(méi)有值的鍵,所以dictionary的下標(biāo)返回dictionary值類(lèi)型的可選值。如果字典包含請(qǐng)求鍵的值,下標(biāo)返回一個(gè)可選值,該值包含該鍵的現(xiàn)有值。否則,下標(biāo)返回nil:
if let airportName = airports["DUB"] {
print("The name of the airport is \(airportName).")
} else {
print("That airport is not in the airports dictionary.")
}
// Prints "The name of the airport is Dublin Airport."
您可以使用下標(biāo)語(yǔ)法,通過(guò)為字典中該鍵值對(duì)賦值為nil 來(lái)刪除該鍵值對(duì):
airports["APL"] = "Apple International"
// "Apple International" is not the real airport for APL, so delete it
airports["APL"] = nil
// APL has now been removed from the dictionary
或者,使用removeValue(forKey:)方法從字典中刪除鍵值對(duì)。該方法刪除鍵值對(duì)(如果存在)并返回刪除的值,或者返回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."
Iterating Over a Dictionary 遍歷字典
使用 for-in 遍歷字典
for (airportCode, airportName) in airports {
print("\(airportCode): \(airportName)")
}
您還可以通過(guò)訪問(wèn)字典的鍵和值屬性來(lái)檢索字典的鍵或值的可迭代集合:
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
如果你需要使用字典的鍵或值與一個(gè)API的數(shù)組實(shí)例,初始化一個(gè)新的數(shù)組與鍵或值的屬性:
let airportCodes = [String](airports.keys)
// airportCodes is ["YYZ", "LHR"]
let airportNames = [String](airports.values)
// airportNames is ["Toronto Pearson", "London Heathrow"]
Swift的字典類(lèi)型沒(méi)有定義順序。若要按特定順序遍歷字典的鍵或值,請(qǐng)對(duì)其鍵或值屬性使用ordered()方法。