當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Swift Dictionary用法及代碼示例

結構

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 運算符在DictionaryNSDictionary 之間進行橋接。為了使橋接成為可能,字典的KeyValue 類型必須是類、@objc 協議或橋接到 Foundation 類型的類型。

DictionaryNSDictionary 的橋接總是需要 O(1) 的時間和空間。當字典的 KeyValue 類型既不是類也不是 @objc 協議時,任何必需的元素橋接都會在第一次訪問每個元素時發生。因此,使用字典內容的第一個操作可能需要 O(n)。

NSDictionaryDictionary 的橋接首先調用字典上的copy(with:) 方法(Objective-C 中的- copyWithZone:)以獲取不可變副本,然後執行額外的 Swift 簿記工作,這需要 O(1) 時間。對於已經不可變的NSDictionary 的實例,copy(with:) 通常在 O(1) 時間內返回相同的字典;否則,複製性能未指定。 NSDictionaryDictionary 的實例使用相同的 copy-on-write 優化來共享緩衝區,這與 Dictionary 的兩個實例共享緩衝區時使用的相同。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Dictionary。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。