Swift字典
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的类型推断为 <String,String>
。
如果键不存在,则返回" nil"。
要删除键,我们只需要将值设置为" nil"即可。
Swift字典的属性和功能
removeAll()
方法用于清除字典的内容。count属性用于获取键值对的数量。
isEmpty返回布尔值,该布尔值指示字典是否为空。
" first"返回第一个元素(字典的键/值对)。
removeValue(forKey:)
删除指定键上的值。
该值可以存储在变量/常量中。我们可以在字典上调用
keys
和values
属性来分别获取键和值的数组。
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
中的当前值