【问题标题】:Concatenate two dictionaries in Swift在 Swift 中连接两个字典
【发布时间】:2015-10-15 12:48:27
【问题描述】:

Swift 为我们提供了许多新功能,例如(终于!)连接字符串甚至数组。但不支持字典。连接字典的唯一方法是为它们重载 + 操作吗?

let string = "Hello" + "World" // "HelloWorld"
let array = ["Hello"] + ["World"] // ["Hello", "World"]
let dict = ["1" : "Hello"] + ["2" : "World"] // error =(

【问题讨论】:

标签: swift dictionary concatenation


【解决方案1】:

像这样使用它:

  1. 把它放在任何地方,例如Dictionary+Extension.swift

     func +<Key, Value> (lhs: [Key: Value], rhs: [Key: Value]) -> [Key: Value] {
         var result = lhs
         rhs.forEach{ result[$0] = $1 }
         return result
     }
    
  2. 现在您的代码可以正常工作了

     let string = "Hello" + "World" // "HelloWorld"
     let array = ["Hello"] + ["World"] // ["Hello", "World"]
     let dict = ["1" : "Hello"] + ["2" : "World"] // okay =)
    

【讨论】:

  • + 是一个糟糕的选择:它通常是一个可交换运算符,而这里不是。
  • 嘿@Raphael,为什么它不是可交换的?给定两个字典,["1" : "Hello"] + ["2" : "World"]["2" : "World"] + ["1" : "Hello"] 将得到相同的结果
  • @YuchenZhong 考虑冲突键的情况:[1: 2, 2: 3] + [2: 4, 3: 5] vs [2: 4, 3: 5] + [1: 2, 2: 3]
  • 嗯,@Raphael,这是一个非常好的电话!是的,在这种情况下,+ 有点误导。
  • 字符串连接 (+) 无论如何都不是可交换的。
【解决方案2】:

这是不可能的,因为第二个字典中可能有匹配的键。但是您可以手动执行此操作,在这种情况下,字典中的值将被替换。

var dict = ["1" : "Hello"]
let dict2 = ["2" : "World"]

for key in dict2.keys {
    dict[key] = dict2[key]
}

【讨论】:

    【解决方案3】:

    您也可以使用 Swift 提供的函数进行合并:

    public func +<K, V>(left: [K:V], right: [K:V]) -> [K:V] {
        return left.merging(right) { $1 }
    }
    

    $1 将从右字典中获取公共键,如果你想优先考虑左字典,你可以使用 $0。

    【讨论】:

      【解决方案4】:

      这可以通过使用 for each loop 和 inout 关键字来完成

      func mergDict(firstDict:inout [String:Any],  secondDict:[String:Any]){
          secondDict.forEach { (key, value) in
              firstDict[key] = value
          }
      }
      

      比打电话像

      mergDict(firstDict: &firstDictToMerge, secondDict: secondDictToMerge)
      

      你会看到你的 firstDictToMerge 将与第二个合并,而不使用任何其他变量

      【讨论】:

      • 没有必要使用forEach。事实上,几乎不需要使用forEach。它只会让你的代码看起来很难看。请改用 for 循环。
      猜你喜欢
      • 1970-01-01
      • 2013-12-07
      • 2013-08-08
      • 1970-01-01
      • 2021-07-23
      • 2017-12-09
      • 2013-07-10
      • 2010-12-19
      相关资源
      最近更新 更多