是否有方法在Swift中同时映射字典键/值?

时间:2016-12-27 09:36:05

标签: arrays swift dictionary mapping

参考: Swift标准库>字典> map(_:)

  

返回一个数组,其中包含映射给定闭包的结果   在序列的元素上。

如上所述,我们可以在字典中进行映射,但输出将是数组,而不是"映射"字典。

老实说,我不太确定是否要说"映射整个字典"是合法的,但我的意思是:

考虑一下我们:

let myDict = ["1": "one","2": "tow","3": "three"]

我们要映射整个事情! (键和值)。输出应该是:

let mappedDict = ["03": "THREE", "02": "TOW", "01": "ONE"]

让我们假设映射的目标是添加" 0"作为所有键的第一个字符,让所有值都是大写的。

为了使其更具可读性,我发布了一个解决方案(我尝试过的)作为答案,而不是在自己的问题中提及它;我认为我的答案不是那么优雅(或者至少我对它的代码味道的感觉),我映射了键,值并将它们组合在一个字典中,每一步都是独立完成的。< / p>

所以,我要问的是:

有没有办法直接一步完成这项工作?类似于:

此代码段演示了我所询问的内容,代码无法正常工作

let myDict = ["1": "one","2": "tow","3": "three"]
let mappedDict = myDict.map { key, value in
    "0" + key
    value.uppercased()
}

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以通过执行以下操作来实现此目的:

let myDict = ["1": "one","2": "tow","3": "three"]

let mappedKeys = myDict.map { "0" + $0.key } // ["02", "01", "03"]
let mappedValues = myDict.map { $0.value.uppercased() } // ["TOW", "ONE", "THREE"]

var mappedDict = [String: String]()

let zippedArray = Array((zip(mappedKeys, mappedValues)))

for element in zippedArray {
    mappedDict[element.0] = element.1
}

print(mappedDict) // ["03": "THREE", "02": "TOW", "01": "ONE"]

为了更清楚,上面的代码片段执行以下操作:

  • 映射字典键。
  • 映射字典值。
  • 创建一个新的空字典mappedDict以附加到它。
  • 将映射的键/值合并到zippedArray(使用zip)。
  • 通过 for-loop 填充mappedDict

答案 1 :(得分:0)

这个怎么样?

zip