【问题标题】:Swift - How can I add an expand a nested dictionary?Swift - 如何添加扩展嵌套字典?
【发布时间】:2015-08-30 06:50:59
【问题描述】:

我想在这种 Array/Tuple/Dictionary data 中添加条目:

var i=0
var data = [("foo", ["first": 1, "second": 2]), ("bar", ["first": 1, "second": 2])] 
var newData = [(Int, [String: AnyObject])]()
for (key, value) in data {

    newData.append((i, value))

    i = i+1
}

for 循环正在将 AnyObject 元组的“键”更改为 Int。 我希望元组也有作为字典的键。

[("foo", ["first": 1, "second": 2]),
 ("bar", ["first": 1, "second": 2])] 

变成

 [(1, ["first": 1, "second": 2]), 
  (2, ["first": 1, "second": 2])] 

而我想要的是:

 [(1, ["first": 1, "second": 2, "key": "foo"]), 
  (2, ["first": 1, "second": 2, "key": "bar"])] 

【问题讨论】:

  • newData 是如何定义的?
  • 您编写对象的方式,它们没有正确嵌套。这不起作用:[(...[...)....

标签: arrays swift dictionary tuples swift2


【解决方案1】:

let data: [(String, [String: AnyObject])] = [
    ("foo", ["first": 1, "second": 2]),
    ("bar", ["first": 1, "second": 2])]

这是一个不需要单独的计数变量的变体

let newData = data.map({ (var e) -> [String: AnyObject] in
    e.1.updateValue(e.0, forKey: "key")
    return e.1
}).enumerate().map({ ($0.0 + 1, $0.1) })

enumerate 调用也可以移到前面,但这会使块签名不那么紧凑。

let newData = data.enumerate().map { (var e) -> ((Int, [String: AnyObject])) in
    e.1.1.updateValue(e.1.0 , forKey: "key")
    return (e.0 + 1, e.1.1)
}

两种变体都会导致

[(1, ["first": 1, "second": 2, "key": "foo"]),
 (2, ["first": 1, "second": 2, "key": "bar"])]

【讨论】:

    【解决方案2】:

    试试这个

    var data = [("foo", ["first": 1, "second": 2]), ("bar", ["first": 1, "second": 2])]
    
    var i = 0
    var newData = [(Int, [String: AnyObject])]()
    for (key, value) in data {
    
      var newValue : [String:AnyObject] = value
      newValue["key"] = key
      newData.append((++i, newValue))
    }
    
    print(newData)
    

    或使用 Swift map 函数

    var i = 0
    let newData = data.map { (key, value) -> (Int, [String: AnyObject]) in
      var newValue = value
      newValue["key"] = key
      return (++i, newValue)
    }
    
    print(newData)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      相关资源
      最近更新 更多