Dictionary 初始化器的语法
在 Swift 中,Dictionary 有一种特别的初始化方式,可以从序列(如数组或字典的 map 结果)中生成字典,同时指定如何处理重复的键:
1、uniqueKeysWithValues:
Dictionary(uniqueKeysWithValues:) 用于从一个 唯一键的键值对序列 创建字典。此方法要求序列中的键必须唯一,否则会导致运行时错误。
Dictionary(uniqueKeysWithValues: Sequence)
假设我们有一个元组数组,每个元组包含一个国家代码和国家名称:
let countryPairs = [("US", "United States"), ("FR", "France"), ("JP", "Japan")]
let countryDict = Dictionary(uniqueKeysWithValues: countryPairs)
print(countryDict) // 输出:["US": "United States", "FR": "France", "JP": "Japan"]
在这个例子中,countryPairs 中的键是唯一的,因此转换为字典时不会出现问题。
2、Sequence, uniquingKeysWith:
Dictionary(_:uniquingKeysWith:) 用于从一个 可能包含重复键的键值对序列 创建字典。遇到重复键时,该方法允许你提供一个闭包来决定保留哪一个值。
Dictionary(Sequence, uniquingKeysWith: (Value, Value) -> Value)
假设我们有一个数组,其中包含一些可能重复的键:
let repeatedPairs = [("US", "United States"), ("FR", "France"), ("US", "USA")]
let uniqueCountryDict = Dictionary(repeatedPairs, uniquingKeysWith: { (first, _) in first })
print(uniqueCountryDict) // 输出:["US": "United States", "FR": "France"]
在这个例子中,数组 repeatedPairs 中包含两个 “US” 键。在使用 uniquingKeysWith 闭包时,我们指定 { (first, _) in first },表示在遇到重复键时保留第一个值 (“United States”),丢弃后续的值 (“USA”)。
如果想保留最后出现的值,我们可以写成 { (_, last) in last }:
let uniqueCountryDict2 = Dictionary(repeatedPairs, uniquingKeysWith: { (_, last) in last })
print(uniqueCountryDict2) // 输出:["US": "USA", "FR": "France"]
在这个版本中,字典会保留 “US”: “USA”。
(_, last) 是两个参数:第一个参数 _ 表示先遇到的值,last 表示后遇到的值。
in 关键字之后的内容是闭包的返回值。在这个例子中,last 是闭包的返回值,表示遇到重复键时保留最后一个值。
因此,Dictionary 将 “US” 重复键的值 “USA”(即第二次出现的值)保留在字典中,而丢弃了第一次出现的 “United States”。
总结
Dictionary(uniqueKeysWithValues:):用于无重复键的序列,直接创建字典。
Dictionary(_:uniquingKeysWith:):用于可能有重复键的序列,提供闭包来解决冲突。
{ (_, last) in last } 保留重复键的最后一个值。
{ (first, _) in first } 保留重复键的第一个值。
这两个闭包只是提供了不同的规则来处理重复键,而 first 和 last 是命名的参数,表示顺序上 先遇到 和 后遇到 的值。