Swift字典

时间:2020-02-23 14:44:00  来源:igfitidea点击:

Swift字典是重要的收藏类型之一。
让我们开始使用XCode启动游乐场。

Swift字典

  • Swift字典是键值对元素的集合。
    它们是具有唯一键的相同类型的值的无序列表。
    在后台,它们只是HashTable。

  • 哈希表是至少由数组和哈希函数组成的数据结构。

  • 当您需要从大数据中搜索内容时,它们非常有用。
    在这种情况下,LinkedList通常会花费更多时间,而复杂度为O(N)或者O(logN)。
    这是Hashtable有用的地方,因为它们可以正常在O(1)时间内返回搜索结果。

  • 库 中的书籍如何排列,以便您可以轻松找到自己喜欢的书籍?您如何在字典中搜索单词?答案是哈希表。
    他们使用哈希函数将数据转换为更简单的数据,以便您可以轻松地从键中跟踪值。

  • Swift字典是值类型。
    不是参考类型。

创建字典

我们初始化的以下字典的键类型为String,值类型为Int:

var countryCodes = [String: Int]()

countryCodes["San Franceco"] = 91
countryCodes["USA"] = 1

在上面的代码中,我们在方括号中初始化字典。
键在冒号的左边,值在右边。

以上是速记语法。
字典的完整语法为:

let dictionary:Dictionary<KeyType, ValueType> = [:]

另外,我们可以定义一个字典,例如:

var secondDictionary = ["Swift" : "iOS", "Java" : "Android" , "Kotlin" : "Android"]

secondDictionary["Java"] //"Android"
secondDictionary["Kotlin"] //"Android"
secondDictionary["Java"] //nil

Swift将Dictionary的类型推断为 &lt;String,String>
如果键不存在,则返回" nil"。
要删除键,我们只需要将值设置为" nil"即可。

Swift字典的属性和功能

  • removeAll()方法用于清除字典的内容。

  • count属性用于获取键值对的数量。

  • isEmpty返回布尔值,该布尔值指示字典是否为空。

  • " first"返回第一个元素(字典的键/值对)。

  • removeValue(forKey:)删除指定键上的值。
    该值可以存储在变量/常量中。

  • 我们可以在字典上调用keysvalues属性来分别获取键和值的数组。

print(countryCodes) //["San Franceco": 91, "USA": 1]
print(countryCodes.first) //prints Optional((key: "San Franceco", value: 91))
let returnedValue = countryCodes.removeValue(forKey: "USA")  //1
countryCodes.removeAll()
countryCodes.count //0
countryCodes.isEmpty //true
print(countryCodes) //prints : [:]

var keysArray = Array(secondDictionary.keys)

遍历Swift字典

为了遍历Swift中的Dictionary,我们使用Tuple和for-in循环。

for (key,value) in secondDictionary
{
  print("key is \(key) and value is \(value)")
}
//Prints

//key is Java and value is Android
//key is Kotlin and value is Android
//key is Swift and value is iOS

由于字典没有顺序,因此您无法预测迭代的顺序。

不存在密钥的默认值

如果键不存在,则可以设置默认值,而不是返回nil,如下所示。

secondDictionary["Python", default: "No Value"] //"No Value"

从两个数组创建字典

我们已将Swift字典转换为Swift数组,以获取键和值数组。
现在,让我们合并两个数组以创建字典。

let keys = ["August", "Feb", "March"]
let values = ["Leo", "Pisces", "Pisces"]
let zodiacDictionary = Dictionary(uniqueKeysWithValues: zip(keys,values))
print(zodiacDictionary)

zip创建一个由两个基础序列组成的成对序列。

处理重复的密钥

如果我们反转上面代码中的键和值,该怎么办?它具有重复的密钥。
让我们看看如何使用zip处理重复密钥。

let zodiacs = ["Leo", "Pisces", "Pisces", "Aries"]
let repeatedKeysDict = Dictionary(zip(zodiacs, repeatElement(1, count: zodiacs.count)), uniquingKeysWith: +)
print(repeatedKeysDict) //["Leo": 1, "Pisces": 2, "Aries": 1]

字典的类型为[String:Int]。
如果存在可重复的元素且默认值设置为1,则每个键的值都会增加。

上面的代码间接获取每个单词的出现次数。

字典过滤和映射

Swift 4产生了对Dictionary的过滤和映射功能,如下所示。

let filtered = repeatedKeysDict.filter { ##代码##.value == 1 }
print(filtered) //prints ["Leo": 1, "Aries": 1]

let mapped = filtered.mapValues{"Occurence is \(##代码##)"}
print(mapped) //prints ["Leo": "Occurence is 1", "Aries": "Occurence is 1"]

$0.values在过滤器中获取当前值。
$0获取mapValues中的当前值