Swift編程五(集合類型)

案例代碼下載

集合類型

Swift提供三種主要的集合類型,為數(shù)組潮改,集合和字典,用于存儲(chǔ)集合值腹暖。數(shù)組是有序的值集合汇在。集合是唯一值的無序集合。字典是鍵值關(guān)聯(lián)的無序集合微服。


image

Swift中的數(shù)組趾疚,集合和字典總是清楚它們可以存儲(chǔ)的值和鍵的類型。這意味著您不能錯(cuò)誤地將錯(cuò)誤類型的值插入到集合中以蕴。這也意味著您可以對(duì)從集合中檢索的值的類型充滿信心糙麦。

注意: Swift的數(shù)組,集合和字典類型實(shí)現(xiàn)為泛型集合丛肮。有關(guān)泛型類型和集合的更多信息赡磅,請(qǐng)參閱泛型。

可變集合

如果創(chuàng)建數(shù)組宝与,集合或字典焚廊,并將其分配給變量,則創(chuàng)建的集合將是可變的习劫。這意味著咆瘟,你可以改變(或變異它是由添加,刪除或改變創(chuàng)建后集合中的項(xiàng)目)的集合诽里。如果將數(shù)組袒餐,集合或字典分配給常量,則該集合是不可變的谤狡,并且其大小和內(nèi)容不能更改灸眼。

注意: 在集合不需要更改的所有情況下,最好創(chuàng)建不可變集合墓懂。這樣做可以使您更容易推理代碼焰宣,并使Swift編譯器能夠優(yōu)化您創(chuàng)建的集合的性能。

數(shù)組

一個(gè)陣列存儲(chǔ)在有序列表中的相同類型的值捕仔。相同的值可以在不同位置多次出現(xiàn)在數(shù)組中匕积。

注意: Swift的Array類型被橋接到Foundation的NSArray類。有關(guān)Array與Foundation和Cocoa一起使用的更多信息榜跌,請(qǐng)參閱數(shù)組和NSArray之間的橋接闸天。

數(shù)組類型速記語法

Swift數(shù)組的類型是完整寫寫法是Array<Element>,其中Element是允許數(shù)組存儲(chǔ)的值的類型斜做。您也可以用簡(jiǎn)寫形式編寫數(shù)組類型[Element]苞氮。雖然這兩種形式在功能上是相同的,但是簡(jiǎn)寫形式是優(yōu)選的瓤逼,并且在引用數(shù)組的類型時(shí)在本指南中使用笼吟。

創(chuàng)建一個(gè)空數(shù)組

您可以使用初始化語法創(chuàng)建某個(gè)類型的空數(shù)組:

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

請(qǐng)注意,someInts變量的類型推斷為[Int]來自初始化程序的類型霸旗。

如果上下文已經(jīng)提供了類型信息贷帮,例如函數(shù)參數(shù)或已經(jīng)鍵入的變量或常量,則可以使用空數(shù)組文字創(chuàng)建一個(gè)空數(shù)組诱告,該數(shù)組寫為[](一對(duì)空方括號(hào)):

someInts.append(3)
someInts = []

創(chuàng)建具有默認(rèn)值的數(shù)組

Swift的Array類型還提供了一個(gè)初始化器撵枢,用于創(chuàng)建一個(gè)特定大小的數(shù)組,并將其所有值設(shè)置為相同的默認(rèn)值。您將此初始值設(shè)定項(xiàng)傳遞給相應(yīng)類型(稱為repeating)的默認(rèn)值:以及在新數(shù)組(被調(diào)用count)中重復(fù)該值的次數(shù):

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

通過添加兩個(gè)數(shù)組來創(chuàng)建數(shù)組

您可以通過使用加法運(yùn)算符(+)將兩個(gè)具有兼容類型的現(xiàn)有數(shù)組相加來創(chuàng)建新數(shù)組锄禽。新數(shù)組的類型是從您添加的兩個(gè)數(shù)組的類型推斷出來的:

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]

使用Array Literal創(chuàng)建數(shù)組

您還可以使用數(shù)組文字初始化數(shù)組潜必,這是將一個(gè)或多個(gè)值寫為數(shù)組集合的簡(jiǎn)便方法。數(shù)組文字被寫為值列表沃但,用逗號(hào)分隔磁滚,由一對(duì)方括號(hào)括起來:[value 1, value 2, value 3]

下面的示例創(chuàng)建一個(gè)名為shoppingList存儲(chǔ)String值的數(shù)組:

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

該shoppingList變量被聲明為“字符串值數(shù)組”,寫為[String]宵晚。由于此特定數(shù)組已指定值類型String垂攘,因此僅允許存儲(chǔ)String值。這里淤刃,shoppingList數(shù)組初始化為兩個(gè)String值("Eggs"和"Milk")晒他,寫在數(shù)組文字中。

注意: 該shoppingList陣列被聲明為一個(gè)變量(由var聲明)逸贾,而不是一個(gè)常數(shù)(用let聲明因?yàn)楦嗟捻?xiàng)目被添加到以下實(shí)例中的購物清單)仪芒。

在這種情況下,數(shù)組文字包含兩個(gè)String值耕陷,而不包含任何其他值掂名。這匹配shoppingList變量聲明的類型(只能包含String值的數(shù)組),因此允許使用數(shù)組文字的賦值作為初始化shoppingList兩個(gè)初始項(xiàng)的方法哟沫。

感謝Swift的類型推斷饺蔑,如果要使用包含相同類型值的數(shù)組文字對(duì)其進(jìn)行初始化,則不必編寫數(shù)組類型嗜诀。初始化shoppingList可能是用較短的形式編寫的:

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

因?yàn)閿?shù)組文字中的所有值都是相同的類型猾警,所以Swift可以推斷出這[String]是用于shoppingList變量的正確類型。

訪問和修改數(shù)組

您可以通過其方法和屬性或使用下標(biāo)語法來訪問和修改數(shù)組隆敢。

要查找數(shù)組中的項(xiàng)數(shù)发皿,請(qǐng)?jiān)L問其只讀屬性count:

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."

您可以通過調(diào)用數(shù)組的append(_:)方法將新項(xiàng)添加到數(shù)組的末尾:

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

使用添加賦值運(yùn)算符(+=)追加一個(gè)或多個(gè)兼容項(xiàng)的數(shù)組:

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

使用下標(biāo)語法從數(shù)組中檢索值,在數(shù)組名稱后面的方括號(hào)內(nèi)傳遞要檢索的值的索引:

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

注意: 數(shù)組中的第一項(xiàng)具有索引0拂蝎,而不是1穴墅。Swift中的數(shù)組始終為零索引。

您可以使用下標(biāo)語法更改給定索引處的現(xiàn)有值:

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

使用下標(biāo)語法時(shí)温自,您指定的索引必須有效玄货。例如,寫入嘗試將項(xiàng)目附加到數(shù)組的末尾shoppingList[shoppingList.count] = "Salt"會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤悼泌。

您還可以使用下標(biāo)語法一次更改值范圍松捉,即使替換值集的長(zhǎng)度與要替換的范圍不同。下面的示例替"Chocolate Spread"換馆里,"Cheese"和"Butter"以及"Bananas"與"Apples":

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

要在指定索引處將項(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

此insert(_:at:)方法調(diào)用會(huì)在購物清單的最開頭插入一個(gè)新項(xiàng)目可柿,其值由索引表示。"Maple Syrup"0

同樣丙者,您使用該remove(at:)方法從數(shù)組中刪除項(xiàng)复斥。此方法刪除指定索引處的項(xiàng)并返回已刪除的項(xiàng)(盡管如果不需要,可以忽略返回的值):

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

注意: 如果嘗試訪問或修改數(shù)組現(xiàn)有邊界之外的索引的值蔓钟,則會(huì)觸發(fā)運(yùn)行時(shí)錯(cuò)誤永票。通過將索引與數(shù)組的count屬性進(jìn)行比較卵贱,可以在使用之前檢查索引是否有效滥沫。數(shù)組中最大的有效索引是count - 1因?yàn)閿?shù)組從零開始索引 - 但是,當(dāng)count是0(意味著數(shù)組為空)時(shí)键俱,沒有有效的索引兰绣。

刪除項(xiàng)時(shí),數(shù)組中的任何間隙都會(huì)關(guān)閉编振,因此index 0處的值再次等于:"Six eggs"

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

如果要從數(shù)組中刪除最終項(xiàng)缀辩,請(qǐng)使用removeLast()方法而不是remove(at:)方法來避免查詢數(shù)組的count屬性。與remove(at:)方法一樣踪央,removeLast()返回已刪除的項(xiàng):

let apples = shoppingList.removeLast()

迭代數(shù)組

可以用數(shù)組for-in循環(huán)遍歷整個(gè)集合值:

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

如果需要每個(gè)項(xiàng)的整數(shù)索引及其值臀玄,請(qǐng)使用該enumerated()方法迭代數(shù)組。對(duì)于數(shù)組中的每個(gè)項(xiàng)畅蹂,該enumerated()方法返回由整數(shù)和項(xiàng)組成的元組健无。整數(shù)從零開始,每個(gè)項(xiàng)目計(jì)數(shù)加1; 如果枚舉整個(gè)數(shù)組液斜,則這些整數(shù)與項(xiàng)目的索引相匹配累贤。您可以將元組分解為臨時(shí)常量或變量,作為迭代的一部分:

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

有關(guān)for- in循環(huán)的更多信息少漆,請(qǐng)參閱For-In循環(huán)臼膏。

集合

集合在集合中存儲(chǔ)相同類型的不同值,沒有定義的順序示损。當(dāng)項(xiàng)目的順序不重要時(shí)渗磅,或者當(dāng)您需要確保項(xiàng)目?jī)H出現(xiàn)一次時(shí),您可以使用集合而不是數(shù)組检访。

注意: Swift的Set類型被橋接到Foundation的NSSet類夺溢。

有關(guān)Set與Foundation和Cocoa一起使用的更多信息,請(qǐng)參閱Set和NSSet之間的橋接烛谊。

集合類型的哈希值

必須是可哈戏缦欤化的類型才能存儲(chǔ)在集合中 - 即,類型必須提供計(jì)算自身哈希值的方法丹禀。哈希值是Int值對(duì)于所有對(duì)象的相等比較的相同值状勤,如果是a == b鞋怀,則遵循a.hashValue == b.hashValue。

所有Swift的基本類型(例如String持搜,Int密似,Double,和Bool)默認(rèn)情況下可哈希葫盼,并可以作為設(shè)定值類型或字典密鍵類型残腌。默認(rèn)情況下,沒有關(guān)聯(lián)值的枚舉案例值(如枚舉中所述)也是可哈希的贫导。

注意: 可以使用自己的自定義類型作為設(shè)置值類型或字典鍵類型抛猫,使它們符合Swift標(biāo)準(zhǔn)庫中的Hashable協(xié)議。符合Hashable協(xié)議的類型必須提供一個(gè)Int名為gettable的屬性hashValue孩灯。hashValue類型屬性返回的值在同一程序的不同執(zhí)行或不同程序中不需要相同闺金。

由于Hashable協(xié)議符合Equatable,符合類型還必須提供equals operator的實(shí)現(xiàn)峰档。Equatable協(xié)議要求任何符合要求的實(shí)現(xiàn)是等價(jià)關(guān)系败匹。也就是說,一個(gè)==實(shí)現(xiàn)必須滿足以下三個(gè)條件讥巡,所有a掀亩,b以及c值:

  • a == a (自反)
  • a == b暗示(對(duì)稱)b == a
  • a == b && b == c暗示(傳遞性)a == c

有關(guān)符合協(xié)議的更多信息,請(qǐng)參閱協(xié)議欢顷。

集合類型語法

Swift集合類型寫為Set<Element>槽棍,Element允許集存儲(chǔ)的類型在哪里。與數(shù)組不同吱涉,集合沒有等效的簡(jiǎn)寫形式刹泄。

創(chuàng)建和初始化空集

可以使用初始化程序語法創(chuàng)建某個(gè)類型的空集:

var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")

注意: 根據(jù)初始化程序的類型推斷l(xiāng)etters變量為Set<Character>類型。

或者怎爵,如果上下文已經(jīng)提供了類型信息特石,例如函數(shù)參數(shù)或已經(jīng)鍵入的變量或常量,則可以使用空數(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>

使用Array Literal創(chuàng)建集合

您還可以使用數(shù)組文字初始化集合鳖链,作為將一個(gè)或多個(gè)值寫為集合集合的簡(jiǎn)寫方式姆蘸。

下面的示例創(chuàng)建一個(gè)名為favoriteGenres存儲(chǔ)String值的集合:

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

favoriteGenres變量被聲明為“一組String值”,寫為Set<String>芙委。由于此特定集已指定值類型String逞敷,因此僅允許存儲(chǔ)String值。在此灌侣,favoriteGenres集合被初始化具有三個(gè)String值("Rock"推捐,"Classical",和)侧啼,陣列字面內(nèi)寫入牛柒。"Hip hop"

注意: favoriteGenres集合被聲明為變量(使用var聲明)而不是常量(使用let聲明)堪簿,因?yàn)樵谙旅娴氖纠刑砑雍蛣h除了項(xiàng)目。

無法僅從數(shù)組文字中推斷出集合類型皮壁,因此Set必須顯式聲明該類型椭更。但是,由于Swift的類型推斷蛾魄,如果使用包含僅一種類型的值的數(shù)組文字初始化它虑瀑,則不必編寫集合元素的類型。初始化favoriteGenres是用較短的形式編寫的:

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

因?yàn)閿?shù)組文字中的所有值都是相同的類型滴须,所以Swift可以推斷出這Set<String>是用于favoriteGenres變量的正確類型舌狗。

訪問和修改集

可以通過其方法和屬性訪問和修改集。

要查找集合中的項(xiàng)目數(shù)描馅,請(qǐng)?jiān)L問其只讀屬性count:

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

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

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

可以通過調(diào)用set的insert(_:)方法將新項(xiàng)添加到集合中:

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

可以通過調(diào)用set的remove(_:)方法從集合中刪除項(xiàng)目把夸,如果該項(xiàng)目是該集合的成員而线,則刪除該項(xiàng)目铭污,并返回已刪除的值,或者如果該集合不包含該項(xiàng)目則返回nil膀篮∴谀或者,可以使用其removeAll()方法刪除集合中的所有項(xiàng)目誓竿。

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."

要檢查集合是否包含特定項(xiàng)目磅网,請(qǐng)使用該contains(_:)方法。

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

遍歷集合

您可以使用for- in循環(huán)遍歷集合中的值筷屡。

for genre in favoriteGenres {
    print("\(genre)")
}
// Classical
// Jazz
// Hip hop

有關(guān)for- in循環(huán)的更多信息涧偷,請(qǐng)參閱For-In循環(huán)。

Swift的Set類型沒有定義的順序毙死。要以特定順序迭代集合的值燎潮,請(qǐng)使用該sorted()方法,該方法將集合的元素作為使用<運(yùn)算符排序的數(shù)組返回扼倘。

for genre in favoriteGenres.sorted() {
    print("\(genre)")
}
// Classical
// Hip hop
// Jazz

集合運(yùn)算

可以有效地執(zhí)行基本集合操作确封,例如將兩個(gè)集合組合在一起,確定兩個(gè)集合具有哪些值再菊,或者確定兩個(gè)集合是否包含全部爪喘,一些或不包含相同的值。

基本集合運(yùn)算

下圖描繪了兩個(gè)集a和b由陰影區(qū)域表示的各種運(yùn)算操作的結(jié)果纠拔。


image
  • 使用intersection(_:)方法創(chuàng)建一個(gè)僅包含兩個(gè)組共有的值的新集秉剑。
  • 使用symmetricDifference(_:)方法創(chuàng)建一個(gè)新集合,其中包含任一集合中的值稠诲,但不包含任兩個(gè)集合都存在的值侦鹏。
  • 使用union(_:)方法創(chuàng)建包含兩個(gè)集中所有值的新集候址。
  • 使用此subtracting(_:)方法創(chuàng)建一個(gè)值不在指定集中的新集。
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()
oddDigits.intersection(evenDigits).sorted()
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()

集合會(huì)員資格和平等

下圖描繪了三個(gè)集合a种柑,b和c具有表示在集合之間共享的元素的重疊區(qū)域岗仑。集合a是集合b的超集,因?yàn)閍包含了所有元素b聚请。相反荠雕,集合b是集合a的子集,因?yàn)閎其中的所有元素也包含在a內(nèi)驶赏。集合b和集合c彼此不相交炸卑,因?yàn)樗鼈儧]有共同的元素。


image
  • 使用“is equal”運(yùn)算符(==)來確定兩個(gè)集合是否包含所有相同的值煤傍。
  • 使用此isSubset(of:)方法確定集合的所有值是否都包含在指定的集合中盖文。
  • 使用此isSuperset(of:)方法確定集合是否包含指定集合中的所有值。
  • 使用isStrictSubset(of:)或isStrictSuperset(of:)方法確定集合是否是指定集合的子集或超集蚯姆,但不等于五续。
  • 使用該isDisjoint(with:)方法確定兩個(gè)集合是否沒有共同的值。
let houseAnimals: Set = ["??", "??"]
let farmAnimals: Set = ["??", "??", "??", "??", "??"]
let cityAnimals: Set = ["??", "??"]
houseAnimals.isSubset(of: farmAnimals)//ture
farmAnimals.isSuperset(of: houseAnimals)//ture
farmAnimals.isDisjoint(with: cityAnimals)//ture

字典

典存儲(chǔ)相同類型的key和相同類型的值且沒有定義排序之間的關(guān)聯(lián)的集合龄恋。每個(gè)值都與唯一key相關(guān)聯(lián)疙驾,唯一key充當(dāng)字典中值的標(biāo)識(shí)符。與數(shù)組中的項(xiàng)目不同郭毕,字典中的項(xiàng)目沒有指定的順序它碎。當(dāng)您需要根據(jù)標(biāo)識(shí)符查找值時(shí),可以使用字典显押,這與使用真實(shí)字典查找特定單詞的定義的方式非常相似扳肛。

注意: Swift的Dictionary類型被橋接到基金會(huì)的NSDictionary類。

有關(guān)Dictionary與Foundation和Cocoa一起使用的更多信息乘碑,請(qǐng)參閱字典和NSDictionary之間的橋接挖息。

字典類型速記語法

Swift字典Dictionary<Key, Value>的類型是完整的,Key是以用作字典鍵的值的類型蝉仇,Value典】為這些鍵存儲(chǔ)的值的類型旋讹。

注意: 字典Key類型必須符合Hashable協(xié)議,如集合的值類型轿衔。

您也可以用簡(jiǎn)寫形式編寫字典類型[Key: Value]沉迹。雖然這兩種形式在功能上是相同的,但是簡(jiǎn)寫形式是優(yōu)選的害驹,并且在本指南中在引用字典的類型時(shí)使用鞭呕。

創(chuàng)建一個(gè)空字典

與數(shù)組一樣,您可以Dictionary使用初始化程序語法創(chuàng)建某個(gè)類型的空:

var namesOfIntegers = [Int: String]()

此示例創(chuàng)建一個(gè)[Int: String]類型的空字典宛官,以存儲(chǔ)整數(shù)值的可讀名稱葫松。它的鍵是Int類型瓦糕,其值是String類型。

如果上下文已經(jīng)提供了類型信息腋么,您可以創(chuàng)建一個(gè)空字典咕娄,其中包含一個(gè)空的字典文字,其寫為[:](一對(duì)方括號(hào)內(nèi)的冒號(hào)):

namesOfIntegers[16] = "sixteen"
namesOfIntegers = [:]

使用Dictionary Literal創(chuàng)建字典

您還可以使用字典文字初始化字典珊擂,字典文字與前面看到的數(shù)組文字具有相似的語法圣勒。字典文字是將一個(gè)或多個(gè)鍵值對(duì)編寫為Dictionary集合的簡(jiǎn)便方法。

鍵值對(duì)是一個(gè)鍵和值的組合摧扇。在字典文字中圣贸,每個(gè)鍵值對(duì)中的鍵和值由冒號(hào)分隔。鍵值對(duì)被寫為列表扛稽,以逗號(hào)分隔吁峻,由一對(duì)方括號(hào)括起:[key 1: value 1, key 2: value 2, key 3: value 3]

以下示例創(chuàng)建一個(gè)字典來存儲(chǔ)國際機(jī)場(chǎng)的名稱。在這個(gè)字典中在张,key是三個(gè)字母的國際航空運(yùn)輸協(xié)會(huì)代碼用含,值是機(jī)場(chǎng)名稱:

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

airports字典被聲明為[String: String]類型的,意思是Dictionary的key為String類型瞧掺,并且其值也是String類型的耕餐。

注意: airports字典被聲明為一個(gè)變量(用var聲明)凡傅,而不是一個(gè)常數(shù)(用let聲明)辟狈,因?yàn)樵谙旅娴睦佑懈嗟臋C(jī)場(chǎng)被添加到詞典中。

使用airports包含兩個(gè)鍵值對(duì)的字典文字初始化字典夏跷。第一對(duì)有一個(gè)鍵值"YYZ"和值"Toronto Pearson"哼转。第二對(duì)有一個(gè)鍵值"DUB"和值"Dublin"。

這個(gè)字典文字包含兩String: String對(duì)槽华。airports鍵值類型匹配變量聲明的類型(僅包含String鍵和String值的字典)壹蔓,因此允許分配字典文字作為使用兩個(gè)初始項(xiàng)初始化airports字典的方法。

與數(shù)組一樣猫态,如果要使用其鍵和值具有一致類型的字典文字對(duì)其進(jìn)行初始化佣蓉,則不必編寫字典類型。初始化airports可能是用較短的形式編寫的:

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

因?yàn)槲淖种械乃墟I都是彼此相同的類型亲雪,并且同樣所有值都是彼此相同的類型勇凭,Swift可以推斷這是用于airports字典的正確類型是[String: String]。

訪問和修改字典

可以通過其方法和屬性或使用下標(biāo)語法來訪問和修改字典义辕。

與數(shù)組一樣虾标,可以通過檢查只讀屬性count來查找Dictionary中的項(xiàng)目數(shù):

print("The airports dictionary contains \(airports.count) items.")

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

if airports.isEmpty {
    print("The airports dictionary is empty.")
} else {
    print("The airports dictionary is empty.")
}

可以使用下標(biāo)語法將新項(xiàng)添加到字典中。使用適當(dāng)類型的新鍵作為下標(biāo)索引灌砖,并指定適當(dāng)類型的新值:

airports["LHR"] = "London"

還可以使用下標(biāo)語法來更改與特定鍵關(guān)聯(lián)的值:

airports["LHR"] = "London Heathrow"

作為下標(biāo)的替代方法updateValue(:forKey:),使用字典的方法來設(shè)置或更新特定鍵的值。與上面的下標(biāo)示例一樣亿卤,updateValue(:forKey:)如果鍵不存在撰豺,則該方法為設(shè)置值,或者如果該鍵已存在則更新值笛园。但是,與下標(biāo)不同,updateValue(_:forKey:)方法在執(zhí)行更新后返回舊值销部。這可以檢查是否進(jìn)行了更新。

updateValue(_:forKey:)方法返回字典值類型的可選值制跟。例如舅桩,對(duì)于存儲(chǔ)String值的字典,該方法返回type String?或“optional String”的值雨膨。如果在更新之前存在該鍵則此可選值包含該鍵的舊值擂涛,如果不存在任何鍵或則為nil:

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

還可以使用下標(biāo)語法從字典中檢索特定鍵的值。因?yàn)榭梢哉?qǐng)求不存在值的鍵聊记,所以字典的下標(biāo)返回字典值類型的可選值撒妈。如果字典包含所請(qǐng)求鍵的值,則下標(biāo)返回包含該鍵的現(xiàn)有值的可選值排监。否則狰右,返回nil:

if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
    print("That airport is not in the airports dictionary.")
}

可以使用下標(biāo)語法通過nil為該鍵指定值來從字典中刪除鍵值對(duì):

airports["APL"] = "Apple International"
airports["APL"] = nil

使用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.")
}

遍歷字典

可以用字典遍歷鍵值對(duì)for- in環(huán)棋蚌。字典中的每個(gè)項(xiàng)都作為元組(key, value)返回,可以將元組的成員分解為臨時(shí)常量或變量挨队,作為迭代的一部分:

for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}

有關(guān)for- in循環(huán)的更多信息谷暮,請(qǐng)參閱For-In循環(huán)。

還可以通過訪問字典的鍵keys和values屬性來檢索字典的鍵或值的可迭代集合:

for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
}
for airportName in airports.values {
    print("Airport name: \(airportName)")
}

如果需要API使用字典的鍵或值來創(chuàng)建Array實(shí)例盛垦,請(qǐng)使用keys或values屬性初始化新數(shù)組:

let airportCodes = [String](airports.keys)
let airportNames = [String](airports.values)

Swift的Dictionary類型沒有定義順序湿弦。要按特定順序迭代字典的鍵或值,請(qǐng)?jiān)谄鋕eys或values屬性上使用sorted()方法腾夯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颊埃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝶俱,更是在濱河造成了極大的恐慌班利,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跷乐,死亡現(xiàn)場(chǎng)離奇詭異肥败,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門馒稍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皿哨,“玉大人,你說我怎么就攤上這事纽谒≈づ颍” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鼓黔,是天一觀的道長(zhǎng)央勒。 經(jīng)常有香客問我,道長(zhǎng)澳化,這世上最難降的妖魔是什么崔步? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮缎谷,結(jié)果婚禮上井濒,老公的妹妹穿的比我還像新娘。我一直安慰自己列林,他們只是感情好瑞你,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著希痴,像睡著了一般者甲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砌创,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天虏缸,我揣著相機(jī)與錄音,去河邊找鬼纺铭。 笑死寇钉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舶赔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼谦秧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竟纳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疚鲤,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤锥累,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后集歇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桶略,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了际歼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惶翻。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹅心,靈堂內(nèi)的尸體忽然破棺而出吕粗,到底是詐尸還是另有隱情,我是刑警寧澤旭愧,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布颅筋,位于F島的核電站,受9級(jí)特大地震影響输枯,放射性物質(zhì)發(fā)生泄漏议泵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一桃熄、第九天 我趴在偏房一處隱蔽的房頂上張望肢簿。 院中可真熱鬧,春花似錦蜻拨、人聲如沸池充。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽收夸。三九已至,卻和暖如春血崭,著一層夾襖步出監(jiān)牢的瞬間卧惜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工夹纫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咽瓷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓舰讹,卻偏偏與公主長(zhǎng)得像茅姜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子月匣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔钻洒,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡(jiǎn)書還為我保存起的...
    Jenaral閱讀 2,762評(píng)論 2 9
  • 前言 3月27號(hào)蘋果發(fā)布了Swift3.1锄开,官方教程也更新到了3.1素标,查看更新記錄發(fā)現(xiàn)更新的內(nèi)容對(duì)之前的文章并沒有...
    BoomLee閱讀 3,139評(píng)論 0 4
  • Swift 語言提供Arrays、Sets和Dictionaries三種基本的集合類型用來存儲(chǔ)集合數(shù)據(jù)萍悴。數(shù)組(Ar...
    窮人家的孩紙閱讀 567評(píng)論 3 2
  • 53.計(jì)算字符 在字符串中獲取字符值的數(shù)量, 可以使用字符串字符屬性中的計(jì)數(shù)屬性: let unusualMena...
    無灃閱讀 1,091評(píng)論 0 4
  • 修改下劃線寬度的坑 效果如下: 代碼實(shí)現(xiàn)方式: 如果想要實(shí)現(xiàn)這種效果头遭,最主要控制的就是下劃線部分寓免,現(xiàn)在網(wǎng)上有很多通...
    lrannn閱讀 2,358評(píng)論 0 0