【问题标题】:Does a Swift Dictionary preserve same order if content is not changed regardless the number of runs?如果无论运行次数多少都没有更改内容,Swift Dictionary 是否会保留相同的顺序?
【发布时间】:2020-02-14 06:57:36
【问题描述】:

根据here回答的问题

字典将相同类型的键和相同类型的值之间的关联存储在没有定义排序的集合中。

因此,

//First Attempt
var dict : Dictionary = ["name1" : "Loy", "name2" : "Roy"]
        println(dict)

//output:
[name2: Roy, name1: Loy]

//Second Attempt
var dict : Dictionary = ["name2" : "Loy", "name1" : "Roy"]
        println(dict)

//output:
[name2: Loy, name1: Roy]

我的问题是,

如果字典的内容没有改变,是否保证顺序保持不变?

例如上面的例子,无论运行次数多少,第一次尝试总是返回相同的顺序?

【问题讨论】:

标签: ios swift sorting dictionary executable


【解决方案1】:

不,不能保证。没有订单就意味着没有订单。不要试图依赖无证事故。事实上,Apple 明确警告说,在现代 Swift 中,顺序是随机的,并且对于不同的运行可能会有所不同。

在您的示例中,您只有一个文字,您可以通过转换为 KeyValuePairs. 来获得保证订单

【讨论】:

  • 马特谢谢。如果我们能参考一下评论“事实上,Apple 明确警告说,在现代 Swift 中,顺序是随机的,不同的运行可能会有所不同”,那就太好了。
【解决方案2】:

只要不修改字典,它的键/值对的顺序就不会改变。其他一切都未指定。来自documentation(强调添加):

字典中键值对的顺序在突变之间是稳定的,但在其他方面是不可预测的。

注意:这仅适用于在单个程序运行中打印/枚举字典正如@matt 所说,每个程序运行的顺序都是随机的。这是因为Hasher 是随机的:

不要在程序的执行过程中保存或以其他方式重复使用哈希值。 Hasher 通常是随机播种的,这意味着它会在程序的每次新执行时返回不同的值。 Hasher 实现的哈希算法本身可能会在标准库的任意两个版本之间发生变化。

在 Swift 4.2 中强制执行哈希随机化,并实现了SE 0206 Hashable Enhancements

为了实现非确定性,Hasher 使用了在进程启动期间由运行时初始化的内部种子值。种子通常由随机数生成器生成,但可以通过在启动 Swift 进程之前将 SWIFT_DETERMINISTIC_HASHING 环境变量的值定义为 1 来禁用它。

【讨论】:

  • 感谢您让我了解了许多未知数。特别感谢您提供我正在寻找的参考。
猜你喜欢
  • 2020-03-31
  • 2020-01-31
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多