# Swift 字典

> 原文： [https://www.programiz.com/swift-programming/dictionary](https://www.programiz.com/swift-programming/dictionary)

#### 在本教程中，您将了解什么是字典，如何创建字典以及字典中的一些常见操作。

在先前的 [Swift Arrays](/swift-programming/arrays "Swift Arrays") 文章中，我们了解了如何在变量/常量中存储多个值。 在本文中，我们将讨论如何将数据/值存储为键值对。

## 什么是字典？

字典只是一个容器，可以无序地将多个数据作为键值对保存。

从[设置](/swift-programming/sets "Swift Sets")开始，每个值都与唯一键相关联并将数据存储在无序列表中，即，您获得的元素顺序与在字典中定义项目的顺序不同。

当您需要在集合中查找带有某些标识符的值时，可以使用字典而不是数组。 假设您可能要搜索国家的首都。 在这种情况下，您将创建一个键为国家和值为首府城市的字典。 现在，您可以通过搜索关键国家来从集合中获取首都。

简单来说，您将键与值配对。 在上面的示例中，我们将一个国家与其首都配对。

* * *

## 如何在 Swift 中声明字典？

您可以通过在方括号`[]`中指定`key:value`数据类型来创建空字典。

### 示例 1：声明一个空字典

```swift
let emptyDic:[Int:String] = [:]
print(emptyDic) 
```

运行该程序时，输出为：

```swift
[:]
```

**或**

您还可以如下定义一个空字典：

```swift
let emptyDic:Dictionary<Int, String> = [:]
print(emptyDic) 
```

在上面的程序中，我们用类型为`Int`的键和类型为`String`的值声明了类型字典的常量`emptyDic`，并使用 0 值对其进行了初始化。

**或**

由于 Swift 是一种类型推断语言，因此您也可以不指定数据类型而直接创建字典，但是必须使用一些值进行初始化，以便编译器可以将其类型推断为：

* * *

### 示例 2：声明具有某些值的字典

```swift
let someDic = ["a":1, "b":2, "c":3, "d":4, "e":5, "f":6, "g":7, "h":8, "i":9]
print(someDic) 
```

运行该程序时，输出为：

```swift
["b": 2, "a": 1, "i": 9, "c": 3, "e": 5, "f": 6, "g": 7, "d": 4, "h": 8]
```

在上面的程序中，我们声明了一个字典，但没有明确定义类型，而是使用一些默认元素进行了初始化。

元素在键值对中，其中`key`的类型为`String`，`value`的类型为`Int`。 由于字典是无序列表，因此`print(someDic)`以不同于定义的顺序输出值。

* * *

### 示例 3：从两个数组创建字典

我们还可以使用数组创建字典。

```swift
let customKeys = ["Facebook", "Google", "Amazon"]
let customValues = ["Mark", "Larry", "Jeff"]
let newDictionary = Dictionary(uniqueKeysWithValues: zip(customKeys,customValues))
print(newDictionary) 
```

运行该程序时，输出为：

```swift
["Amazon": "Jeff", "Google": "Larry", "Facebook": "Mark"]
```

在上述程序中，`zip(customKeys,customValues)`创建一个新的*元组*序列，每个元素表示来自`customKeys`和`customValues`的值。 要了解有关`zip`的工作原理的更多信息，请访问 Swift `zip`。

现在，我们可以将此序列传递给`Dictionary(uniqueKeysWithValues:)`初始化程序，并创建一个新的`Dictionary`。 因此，`print(newDictionary)`输出具有两个数组元素的新字典。

* * *

## 如何在 Swift 中访问字典元素？

作为数组，您可以使用*下标语法*来访问字典的元素。 您需要在字典名称之后立即在方括号中包括要访问的值的键。

### 示例 4：访问字典的元素

```swift
let someDic = ["a":1, "b":2, "c":3, "d":4, "e":5, "f":6, "g":7, "h":8, "i":9]
print(someDic["a"])
print(someDic["h"]) 
```

运行该程序时，输出为：

```swift
Optional(1)
Optional(8) 
```

您还可以使用`for-in`循环访问字典的元素。

* * *

### 示例 5：使用`for-in`循环访问字典的元素

```swift
let someDic = ["a":1, "b":2, "c":3, "d":4, "e":5, "f":6, "g":7, "h":8, "i":9]
for (key,value) in someDic {
    print("key:\(key) value:\(value)")
} 
```

运行该程序时，输出为：

```swift
key:b value:2
key:a value:1
key:i value:9
key:c value:3
key:e value:5
key:f value:6
key:g value:7 
```

* * *

## 如何在 Swift 中修改字典元素？

您可以使用*下标语法*在字典中添加元素。 您需要包括新关键字作为下标索引，并为`Dictionary`分配一个新的类型值。

### 示例 6：在字典中设置元素

```swift
var someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
someDictionary["Japan"] = "Tokyo"
print(someDictionary) 
```

运行该程序时，输出为：

```swift
["Japan": "Tokyo", "China": "Beijing", "India": "NewDelhi", "Nepal": "Kathmandu"]
```

在上面的示例中，我们使用下标语法在给定的字典中创建了一个新的键值对`"Japan": "Tokyo"`。

您还可以使用下标语法将与特定键关联的值更改为：

* * *

### 示例 7：更改字典的元素

```swift
var someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
someDictionary["Nepal"] = "KATHMANDU"
print(someDictionary) 
```

运行该程序时，输出为：

```swift
["China": "Beijing", "India": "NewDelhi", "Nepal": "KATHMANDU"]
```

* * *

## 一些有用的内置字典功能&属性

### 1\. `isEmpty`

此属性确定字典是否为空。 如果字典不包含任何值，则返回`true`，否则返回`false`。

#### 示例 8：`isEmpty`如何工作？

```swift
let someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
print(someDictionary.isEmpty) 
```

运行该程序时，输出为：

```swift
false
```

* * *

### 2.`first`

此属性用于访问字典的第一个元素。

#### 示例 9：`first`如何工作？

```swift
let someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
print(someDictionary.first) 
```

运行该程序时，输出为：

```swift
Optional((key: "China", value: "Beijing"))
```

* * *

### 3.`count`

此属性返回字典中的元素总数（键值对）。

#### 示例 10：`count`如何工作？

```swift
let someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
print(someDictionary.count) 
```

运行该程序时，输出为：

```swift
3
```

* * *

### 4.`keys`

此属性返回字典中的所有键。

#### 示例 11：`keys`如何工作？

```swift
var someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
let dictKeys  = Array(someDictionary.keys)
print(dictKeys) 
```

运行该程序时，输出为：

```swift
["China", "India", "Nepal"]
```

同样，您可以使用值来获取字典中的所有值。

* * *

### 5\. `removeValue`

此函数从字典中删除并返回用键指定的值。 这两个键值对将从字典中删除。

#### 示例 12：`removeValue()`如何工作？

```swift
var someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
let val  = someDictionary.removeValue(forKey: "Nepal")
print(val)
print(someDictionary) 
```

运行该程序时，输出为：

```swift
Optional("Kathmandu")
["India": "NewDelhi", "China": "Beijing"] 
```

同样，您也可以使用`removeAll`函数清空字典。

* * *

## 要记住的事情

**1\.** 在 Swift 中使用下标语法访问字典元素时，必须确保键位于索引中，否则将获得`nil`值。 让我们在示例中看一下：

### 示例 13：键必须存在

```swift
var someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
let val  = someDictionary["Japan"]
print(val) 
```

运行该程序时，输出为：

```swift
nil
```

在上述程序中，没有键`Japan`。 因此，当您尝试访问键`Japan`的值时，将获得`nil`值。

**2\.** 同样，键值在 Swift 中区分大小写，因此您必须确保使用正确的大小写键/值。 否则，您将获得`nil`值。 让我们在示例中看一下：

### 示例 14：键区分大小写

```swift
var someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
let val  = someDictionary["nepal"]
print(val) 
```

运行该程序时，输出为：

```swift
nil
```

在以上程序中，没有`nepal`。 因此，当您尝试访问键`nepal`的值时，您将获得`nil`值。

**3\.** 如果给定键的值不存在，则还有一种方法可以提供默认值。 让我们在示例中看一下：

### 示例 12：不存在的键的默认值

```swift
var someDictionary = ["Nepal":"Kathmandu", "China":"Beijing", "India":"NewDelhi"]
let val  = someDictionary["nepal", default:"Not Found"]
print(val) 
```

运行该程序时，输出为：

```swift
Not Found
```

在上述程序中，我们在访问字典时在`default`参数中指定了**值**。 如果键的值不存在，则返回默认值，否则返回该值。

在我们的例子中，键`nepal`不存在，因此程序返回`Not Found`。