Swift - порядок сохраненных значений полностью изменяется в словаре

Я попытался отобразить данные, которые находятся в формате словаря. Ниже приведены три попытки. Первая попытка, порядок вывода полностью изменяется. Вторая попытка, порядок вывода такой же, как и вход. Но в третьей попытке я объявил переменную как NSDictionary. Точный выход, который я получил. Почему это изменяется в словаре? Пожалуйста, направляйте меня. Я искал тег Swift Dictionary. Но я не мог понять.

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

//Third Attempt With NSDictionary
var dict : NSDictionary = ["name1" : "Loy", "name2" : "Roy"]
            println(dict)

//output:
{
    name1 = Loy;
    name2 = Roy;
}

ДРУГОЙ ВОПРОС: Я использовал игровое поле для проверки. Мой снимок экрана ниже:

play_ground_screen_shot

Здесь, в NSDictionary, я дал name5 как первый, но в правой части name2 отображается, а затем в println отображается в порядке возрастания. Почему это происходит?

play_ground_screen_shot_2

Здесь, в словаре, я дал name5 как первый, но в правой части name2 отображается, а затем в println отображается, как это делается в строке словаря. Почему это происходит?

Ответы

Ответ 1

Это из-за определения словарей:

толковый словарь

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

Там нет порядка, они могут выйти по-другому, чем они были введены.
Это сопоставимо с NSSet.


Редактировать:

NSDictionary

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

Там также нет порядка, однако есть сортировка на печать для целей отладки.

Ответ 2

Вы не можете сортировать словарь, но можете сортировать его ключи и прокручивать их следующим образом:

let myDictionary = ["name1" : "Loy", "name2" : "Roy", "name3" : "Tim", "name4" : "Steve"]   // ["name1": "Loy", "name2": "Roy", "name3": "Tim", "name4": "Steve"]


let sorted = myDictionary.sorted {$0.key < $1.key}  // or {$0.value < $1.value} to sort using the dictionary values
print(sorted) // "[(key: "name1", value: "Loy"), (key: "name2", value: "Roy"), (key: "name3", value: "Tim"), (key: "name4", value: "Steve")]\n"
for element in sorted {
    print("Key = \(element.key) Value = \(element.value)" )
}

Ответ 3

Ни NSDictionary, ни Swift::Dictionary не заказывает его хранение. Разница в том, что некоторые объекты NSDictionary сортируют свой вывод при печати, а Swift::Dictionary - нет.

Из документации -[NSDictionary description]:

Если каждая клавиша в словаре является объектом NSString, записи перечисленные в порядке возрастания по ключу, иначе порядок, в котором записи указаны undefined. Это свойство предназначено для производства читаемый вывод для целей отладки, а не для сериализации данных.

Ответ 4

Это действительно проблема со словарями. Тем не менее, есть библиотека, доступная, чтобы убедиться, что порядок остается таким, как вы его инициализировали.

OrderedDictionary - это облегченная реализация упорядоченной структуры данных словаря в Swift.

Структура OrderedDictionary - это неизменная общая коллекция, которая объединяет функции словаря и массива из стандартной библиотеки Swift. Как и словарь, он хранит пары ключ-значение и сопоставляет каждую клавишу с значением. Подобно массиву Array, он сохраняет эти пары, отсортированные и доступные индексом с нулевым значением.

Проверьте здесь: https://github.com/lukaskubanek/OrderedDictionary

Ответ 5

От Язык быстрого программирования:

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

В принципе, порядок элементов, как видно на выходе, произволен, зависит от внутренней реализации структуры данных и не следует полагаться.

Ответ 6

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

var user: KeyValuePairs<String, String> {
    return ["FirstName": "NSDumb",
            "Address": "some address value here",
            "Age":"30"]
}

печать

["FirstName": "NSDumb", "Address": "some address value", "Age": "30"]