Почему цикл for для словаря не последовательный - PullRequest
0 голосов
/ 11 мая 2019

Почему цикл for-in для словаря не последовательный

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}

Выход.

ants have 6 legs
spiders have 8 legs
cats have 4 legs

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Если вы нажимаете , нажимаете Dictionary, всплывающее окно очень подробно рассказывает о Dictionary.

Три ключевых момента из документации Apple:

  1. Каждый словарь - это неупорядоченный набор пар ключ-значение .
  2. Порядок пар ключ-значение в словаре стабилен между мутациями, но в остальном непредсказуем.
  3. Если вам нужен упорядоченный набор пар ключ-значение и вам не нужен быстрый поиск ключей, который обеспечивает Словарь, см. KeyValuePairs тип для альтернативы.

опция - нажмите на KeyValuePairs выходы (я добавил нумерацию):

  1. Используйте экземпляр KeyValuePairs, когда вам нужно упорядоченную коллекцию пары ключ-значение и не требуют быстрого поиска ключа, что Dictionary тип обеспечивает.
  2. В отличие от пар ключ-значение в настоящем словаре, ни ключ, ни значение KeyValuePairs экземпляра не должны соответствовать к протоколу Hashable.
  3. Вы инициализируете KeyValuePairs экземпляр используя словарь Swift.
  4. Помимо поддержания порядка оригинальный словарь, KeyValuePairs также допускает дублирование ключи.

Вот ваш пример использования KeyValuePairs:

let numberOfLegs: KeyValuePairs = ["spider": 8, "ant": 6, "cat": 4]

// Now this gives the order you expect
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}

Выход:

spiders have 8 legs
ants have 6 legs
cats have 4 legs
// But KeyValuePairs cannot be used for fast key lookup like a Dictionary
// If you don't have duplicate keys, you can convert the KeyValuePairs
// to Dictionary like this for normal lookup operations
let numberOfLegsDict = Dictionary(uniqueKeysWithValues: numberOfLegs.map {(key: $0, value: $1)})

Примечание: KeyValuePairs в Swift 4.2 и более ранних версиях называлось DictionaryLiteral.

0 голосов
/ 11 мая 2019

Как сказал Александр в своем комментарии, словари являются неупорядоченными коллекциями. У них нет какого-то определенного порядка для них. Если вы хотите упорядочить, используйте массив структур. Массивы do сохраняют порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...