Swift Dictionary 初始化器
Swift Dictionary 初始化器

Swift Dictionary 初始化器

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 是命名的参数,表示顺序上 先遇到 和 后遇到 的值。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注