【问题标题】:How to update value of a key of all objects from array of dictionary in swift3 without enumeration?如何在不枚举的情况下更新swift3中字典数组中所有对象的键值?
【发布时间】:2017-02-01 08:09:18
【问题描述】:

swift3中如何在不枚举的情况下更新字典数组中所有对象的键值?

例如

let tags = [Dict("key1":true, "key2":1),Dict("key1":true,
"key2":2),Dict("key1":false, "key2":3),Dict("key1":true, "key2":1),
Dict("key1": false, "key2":1)] 

现在我想为所有 Dict 对象更改 "key1":false 的值。

即我需要这样的输出

tag : [Dict("key1": false, "key2":1),Dict("key1": false,
"key2":2),Dict("key1":false, "key2":3),Dict("key1": false, "key2":1),
Dict("key1": false, "key2":1)]

我可以在没有枚举或迭代的情况下实现这一目标吗?以及如何?

【问题讨论】:

  • 您的代码无效。
  • 什么是Dict
  • 为什么不使用迭代器?序列的全部意义不在于它的可迭代性吗?
  • 您必须显式或隐式地遍历数组。例如下面使用map 的答案仍然遍历数组,它只是“隐藏”。

标签: ios swift3


【解决方案1】:

你可以使用map函数:

let tags = [
    ["key1": true,  "key2": 1],
    ["key1": true,  "key2": 2],
    ["key1": false, "key2": 3],
    ["key1": true,  "key2": 1],
    ["key1": false, "key2": 1]]

let newTags = tags.map { (dict) -> [String : Any] in
    // dict is immutable, so you need a mutable shadow copy:
    var dict = dict

    dict["key1"] = false
    return dict
}

如 Paulw11 所述,此函数仍在隐式迭代。在一般情况下,如果您需要全部更新条目,您必须遍历条目。

根据您的数据,您可以使用引用类型对要更新的值进行建模。这对于大型已知数据组共享相同状态的大型数据集可能是有益的。

【讨论】:

  • 这个没有错,但是还是会迭代
  • 是的。但最后,如果你想更新每个字典中的条目,你需要触摸所有字典,对吧?在一般情况下,迭代是执行此操作的方法。在你的情况下迭代有什么问题?
  • 没有迭代是不可能做到的。我只是指出这个解决方案有一个隐式迭代
  • 嗯,是的,但我认为这很重要。理论上,任何循环都可以展开为一系列离散的访问。事实上,如果您有一个大规模并行处理器,例如 DSP 或超级计算机,那么循环展开是一种常用技术,编译器可以为您执行此优化。
  • @Paulw11:对不起,我在看到你的答案之前删除了我的评论。我认为最好添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
相关资源
最近更新 更多