Dictionary
聲明
@frozen struct Dictionary<Key, Value> where Key : Hashable
概述
字典是一種哈希表,提供對其包含的條目的快速訪問。表中的每個條目都使用其鍵標識,鍵是可散列的類型,例如字符串或數字。您使用該鍵來檢索相應的值,該值可以是任何對象。在其他語言中,類似的數據類型稱為散列或關聯數組。
使用字典文字創建一個新字典。字典文字是逗號分隔的鍵值對列表,其中冒號將每個鍵與其關聯的值分開,並用方括號括起來。您可以將字典文字分配給變量或常量,或將其傳遞給需要字典的函數。
以下是創建 HTTP 響應代碼及其相關消息的字典的方法:
var responseMessages = [200: "OK",
403: "Access forbidden",
404: "File not found",
500: "Internal server error"]
responseMessages
變量被推斷為具有類型 [Int: String]
。字典的 Key
類型是 Int
,字典的 Value
類型是 String
。
要創建沒有鍵值對的字典,請使用空字典文字 ([:]
)。
var emptyDict: [String: String] = [:]
任何符合 Hashable
協議的類型都可以用作字典的 Key
類型,包括 Swift 的所有基本類型。通過使它們符合Hashable
協議,您可以使用自己的自定義類型作為字典鍵。
獲取和設置字典值
訪問字典中值的最常見方法是使用鍵作為下標。使用鍵下標采用以下形式:
print(responseMessages[200])
// Prints "Optional("OK")"
使用鍵為字典下標會返回一個可選值,因為字典可能不包含您在下標中使用的鍵的值。
下一個示例使用 responseMessages
字典的基於鍵的下標,其中兩個鍵存在於字典中,一個鍵不存在。
let httpResponseCodes = [200, 403, 301]
for code in httpResponseCodes {
if let message = responseMessages[code] {
print("Response \(code): \(message)")
} else {
print("Unknown response \(code)")
}
}
// Prints "Response 200: OK"
// Prints "Response 403: Access forbidden"
// Prints "Unknown response 301"
您還可以使用基於鍵的下標更新、修改或刪除字典中的鍵和值。要添加新的鍵值對,請將值分配給尚未成為字典一部分的鍵。
responseMessages[301] = "Moved permanently"
print(responseMessages[301])
// Prints "Optional("Moved permanently")"
通過將新值分配給字典中已存在的鍵來更新現有值。如果您將 nil
分配給現有鍵,則會刪除該鍵及其關聯值。以下示例將404
代碼的值更新為簡單的“Not found”,並完全刪除500
代碼的鍵值對。
responseMessages[404] = "Not found"
responseMessages[500] = nil
print(responseMessages)
// Prints "[301: "Moved permanently", 200: "OK", 403: "Access forbidden", 404: "Not found"]"
在可變的 Dictionary
實例中,您可以就地修改您通過鍵控下標訪問的值。下麵的代碼示例聲明了一個名為 interestingNumbers
的字典,其中包含整數數組的字符串鍵和值,然後按降序對每個數組進行就地排序。
var interestingNumbers = ["primes": [2, 3, 5, 7, 11, 13, 17],
"triangular": [1, 3, 6, 10, 15, 21, 28],
"hexagonal": [1, 6, 15, 28, 45, 66, 91]]
for key in interestingNumbers.keys {
interestingNumbers[key]?.sort(by: >)
}
print(interestingNumbers["primes"]!)
// Prints "[17, 13, 11, 7, 5, 3, 2]"
迭代字典的內容
每個字典都是鍵值對的無序集合。您可以使用 for
- in
循環遍曆字典,將每個鍵值對分解為元組的元素。
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
for (name, path) in imagePaths {
print("The path to '\(name)' is '\(path)'.")
}
// Prints "The path to 'star' is '/glyphs/star.png'."
// Prints "The path to 'portrait' is '/images/content/portrait.jpg'."
// Prints "The path to 'spacer' is '/images/shared/spacer.gif'."
字典中鍵值對的順序在突變之間是穩定的,但在其他方麵是不可預測的。如果您需要鍵值對的有序集合並且不需要Dictionary
提供的快速鍵查找,請參閱KeyValuePairs
類型以獲取替代方案。
您可以使用默認實現提供的 contains(where:)
或 firstIndex(where:)
方法在字典的內容中搜索特定值。以下示例檢查 imagePaths
是否包含 "/glyphs"
目錄中的任何路徑:
let glyphIndex = imagePaths.firstIndex(where: { $0.value.hasPrefix("/glyphs") })
if let index = glyphIndex {
print("The '\(imagePaths[index].key)' image is a glyph.")
} else {
print("No glyphs found!")
}
// Prints "The 'star' image is a glyph.")
請注意,在此示例中,imagePaths
使用字典索引進行下標。與基於鍵的下標不同,基於索引的下標將對應的鍵值對作為非可選元組返回。
print(imagePaths[glyphIndex!])
// Prints "(key: "star", value: "/glyphs/star.png")"
隻要字典有足夠的容量來存儲添加的值而不分配更多緩衝區,字典的索引在添加到字典時保持有效。當字典超出其緩衝區時,現有索引可能會在沒有任何通知的情況下失效。
當您知道要向字典添加多少新值時,請使用 init(minimumCapacity:)
初始化程序分配正確數量的緩衝區。
字典和 NSDictionary 之間的橋接
您可以使用as
運算符在Dictionary
和NSDictionary
之間進行橋接。為了使橋接成為可能,字典的Key
和Value
類型必須是類、@objc
協議或橋接到 Foundation 類型的類型。
從 Dictionary
到 NSDictionary
的橋接總是需要 O(1) 的時間和空間。當字典的 Key
和 Value
類型既不是類也不是 @objc
協議時,任何必需的元素橋接都會在第一次訪問每個元素時發生。因此,使用字典內容的第一個操作可能需要 O(n
)。
從NSDictionary
到Dictionary
的橋接首先調用字典上的copy(with:)
方法(Objective-C 中的- copyWithZone:
)以獲取不可變副本,然後執行額外的 Swift 簿記工作,這需要 O(1) 時間。對於已經不可變的NSDictionary
的實例,copy(with:)
通常在 O(1) 時間內返回相同的字典;否則,複製性能未指定。 NSDictionary
和 Dictionary
的實例使用相同的 copy-on-write 優化來共享緩衝區,這與 Dictionary
的兩個實例共享緩衝區時使用的相同。
可用版本
相關用法
- Swift Dictionary.Keys shuffled()用法及代碼示例
- Swift Dictionary.Keys.Iterator next()用法及代碼示例
- Swift Dictionary.Keys dropFirst(_:)用法及代碼示例
- Swift Dictionary allSatisfy(_:)用法及代碼示例
- Swift Dictionary.Index ..<(_:_:)用法及代碼示例
- Swift Dictionary values用法及代碼示例
- Swift Dictionary dropFirst(_:)用法及代碼示例
- Swift Dictionary firstIndex(where:)用法及代碼示例
- Swift Dictionary first(where:)用法及代碼示例
- Swift Dictionary.Keys firstIndex(where:)用法及代碼示例
- Swift Dictionary.Values min(by:)用法及代碼示例
- Swift Dictionary.Keys description用法及代碼示例
- Swift Dictionary.Index ...(_:_:)用法及代碼示例
- Swift Dictionary merge(_:uniquingKeysWith:)用法及代碼示例
- Swift Dictionary.Keys contains(_:)用法及代碼示例
- Swift Dictionary.Keys reduce(_:_:)用法及代碼示例
- Swift Dictionary.Keys first用法及代碼示例
- Swift Dictionary.Index ...(_:)用法及代碼示例
- Swift Dictionary subscript(_:default:)用法及代碼示例
- Swift Dictionary.Values prefix(upTo:)用法及代碼示例
- Swift Dictionary.Keys suffix(_:)用法及代碼示例
- Swift Dictionary isEmpty用法及代碼示例
- Swift Dictionary.Keys prefix(_:)用法及代碼示例
- Swift Dictionary.Values min()用法及代碼示例
- Swift Dictionary reduce(_:_:)用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Dictionary。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。