【问题标题】:How can I initialize an OrderedDictionary from a regular Dictionary in Swift?如何在 Swift 中从常规字典初始化 OrderedDictionary?
【发布时间】:2022-02-02 14:29:48
【问题描述】:

Apples swift-collections 包提供了Dictionary 类型的替代方案,它保证保持(而不是带来)其键值对按顺序排列(不像常规的Dictionary 类型)。但是如何将Dictionary 类型的实例转换为OrderedDictionary 类型的实例以便以后重新排序?

例如,它如何用于这个 dict:

let regularDict: [String: String] = ["key1": "value1", "key2": "value2"]
// => EITHER {key2=>value2, key1=>value1} OR {key1=>value1, key2=>value2}

let orderedDict: OrderedDictionary<String, String> = .init(/* ??? */)

我知道orderedDict 一开始会有一个随机顺序的键值条目,这对我来说很好,我只需要一个OrderedDictionary 实例,以便将来对顺序进行任何更改我让你不要迷路。我只想知道如何以一种高效的方式从Dictionary 初始化它,并确保键保持连接到正确的值。

【问题讨论】:

  • “保持……有序”是什么意思?添加它们的顺序(如果您提供无序数据进行初始化,会发生什么情况)?数字顺序?按字母顺序?通过自定义闭包还是标准排序?
  • 没有办法完成您的要求。字典是一个无序的集合。如果您通过字典获取值,则无法预测您的有序字典顺序。
  • 使用字典来初始化你的OrderedDictionary 没有任何意义。
  • BTW AFAIK OrderedDictionary 符合 ExpressibleByDictionaryLiteral 并会保留所需的顺序。这是初始化您的有序字典let orderedDic: OrderedDictionary = ["key1": "value1", "key2": "value2"] 或使用另一个有序集合(如序列、集合或数组)的属性。无法预测字典或集合的顺序。
  • @LeoDabus 我刚刚添加了 cmets 以使其更加清晰,希望对您有所帮助。

标签: swift collections type-conversion ordereddictionary


【解决方案1】:

您可以将init(uniqueKeys:values:) 与常规字典的keysvalues 一起使用:

let regularDict = ["key1": "value1", "key2": "value2"]
// => EITHER {key2=>value2, key1=>value1} OR {key1=>value1, key2=>value2}

var orderedDict = OrderedDictionary<String, String>(
  uniqueKeys: regularDict.keys, 
  values: regularDict.values
)
// => EITHER {key2=>value2, key1=>value1} OR {key1=>value1, key2=>value2}

这不会神奇地对任何东西进行排序,生成的orderedDict 将具有与regularDict 相同的随机顺序的键值条目。但是将来对订单的任何更改都将是持久的。例如,您可以通过符合Comparable 的类型的键进行排序,如下所示:

orderedEntries.sort(by: { $0.key < $1.key })
// => {key1=>value1, key2=>value2}

【讨论】:

  • 但这将创建一个有序字典,它具有旧字典的随机顺序。或者这与问题无关?
  • @JoakimDanielson 与我的问题无关,我非常具体地询问如何用我可用的Dictionary 初始化OrderedDictionary。起初我很清楚这将导致随机顺序,但你可能是对的,我应该更明确地说明这一点。我将编辑问题和答案以使这一点更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2016-09-21
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多