Сохраняет ли Swift Dictionary тот же порядок, если содержимое не изменяется независимо от количества прогонов? - PullRequest
0 голосов
/ 17 октября 2019

В соответствии с вопросом, на который дан ответ в здесь

Словарь хранит ассоциации между ключами одного типа и значениями того же типа в коллекции без определенного порядка.

Таким образом,

//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]

Мой вопрос:

Гарантируется ли, что если содержание словаря не изменится, порядокостанется неизменным?

Например, для приведенного выше примера First Attempt всегда возвращает один и тот же порядок независимо от количества прогонов?

Ответы [ 2 ]

3 голосов
/ 17 октября 2019

Нет, это не гарантируется. Нет заказа означает нет заказа. Не пытайтесь полагаться на несчастные случаи без документов. На самом деле Apple явно предупреждает, что в современном Swift порядок является случайным и может быть разным для разных серий.

В вашем примере, где у вас есть только литерал, вы можете получить гарантированный заказ, приведя к KeyValuePairs.

2 голосов
/ 17 октября 2019

Пока вы не измените словарь, порядок его пар ключ / значение не изменится. Все остальное не уточняется. Из документации (выделение добавлено):

Порядок пар ключ-значение в словаре стабилен между мутациями , но в остальном непредсказуем.

Примечание: Это относится только к печати / нумерации словаря в пределах одного запуска программы. Как сказал @matt, порядок случайным образом устанавливается при каждом запуске программы. И это потому, что Hasher рандомизирован:

Не сохраняйте и не используйте повторно хеш-значения при выполнении вашей программы. Hasher обычно отбирается случайным образом, что означает, что он будет возвращать разные значения при каждом новом выполнении вашей программы. Алгоритм хеширования, реализованный Hasher, может сам меняться между любыми двумя версиями стандартной библиотеки.

Рандомизация хеш-функции была введена в Swift 4.2 с реализацией SE 0206 Hashable Enhancements :

Для реализации недетерминизма, Hasher использует внутреннее начальное значение, инициализированное средой выполнения во время запуска процесса. Начальное число обычно создается генератором случайных чисел, но его можно отключить, определив переменную среды SWIFT_DETERMINISTIC_HASHING со значением 1 до начала процесса Swift.

...