Как сортируется Dictionary по-умолчанию в Swift?

При создании Dictionary меняется порядок созданных элементов. Как объяснить подобное поведение? И можно ли восстановить порядок, который используется в коде без костылей?

Используемый код
struct Seller {
  var name:String
  var description:String
}

var magazines = [
  "Москва": [
    Seller(name: "Веранда 32.05", description: "Каретный Ряд, 3, стр. 6"),
    Seller(name: "Кинотеатр «35мм»", description: "ул. Покровка, 47/24"),
    Seller(name: "Книжный магазин ArtBookShop", description: "ул. Петровка, 25, стр.1"),
    Seller(name: "Книжный магазин ArtBookShop", description: "Гоголевский б-р, 10"),
    Seller(name: "Книжный магазин ArtBookShop", description: "Берсеневская наб., 14, стр. 5а, институт Strelka")
  ],
  "Санкт-Петербург": [
    Seller(name: "Галерея современного искусства Anna Nova", description: "ул. Жуковского, 28"),
    Seller(name: "Магазин BagBox", description: "Большой пр-т П. С., 100"),
    Seller(name: "Бар Brimborium", description: "ул. Маяковского, 22–24"),
    Seller(name: "Wood Bar", description: "ул. Марата, 34")
  ],
  "Астрахань": [
    Seller(name: "Jab Barbershop", description: "Наб. 1 Мая, 91 / ул. Мечникова, 9 (угол дома)")
  ],
  "Белгород": [
    Seller(name: "Кофейная компания «Калипсо»", description: "Пр-т. Богдана Хмельницкого, 79")
  ],
  "Владивосток": [
    Seller(name: "Geometria.ru", description: ""),
    Seller(name: "Рюкзак-шоп «Сопка»", description: "ул. Адмирала Фокина, 5"),
    Seller(name: "Студия «Неформат»", description: "ул. Алеутская, 11, здание «Приморгражданпроекта», 10-й эт., оф. 1001/1")
  ],
  "Воронеж": [
    Seller(name: "Магазин-клуб FreakFabrique", description: "ул. Никитинская, 2 (перекресток с Комиссаржевской)")
  ],
  "Екатеринбург": [
    Seller(name: "Книжный магазин «Йозеф Кнехт»", description: "ул. 8 Марта, 7")
  ],
  "Ижевск": [
    Seller(name: "Арт-пространство «Сахар»", description: "ул. Горького, 76, 2 эт. (центр напротив Национального театра и Летнего сада)")
  ],
  "Иркутск": [
    Seller(name: "Кафе NUUT", description: "ул. Сухэ-Батора, 10"),
    Seller(name: "Арт-пространство «Магазин подарков №1»", description: "")
  ],
  "Казань": [
    Seller(name: "Парикмахерская Chop-Chop", description: "ул. Профсоюзная, 1")
  ],
  "Краснодар": [
    Seller(name: "Шоурум JIGO", description: "ул. Мира, 44")
  ],
  "Красноярск": [
    Seller(name: "Парикмахерская Chop­-chop", description: "ул. Красной Армии, 9/1")
  ],
  "Липецк": [
    Seller(name: "Rob Roy Bar", description: "ул. Ворошилова, 1")
  ],
  "Мурманск": [
    Seller(name: "New York Coffee (Тайм-Кофейня)", description: "ул. Буркова, 13")
  ],
  "Новороссийск": [
    Seller(name: "Парикмахерская Chop­-сhop", description: "ул. Мира, 35")
  ],
  "Новосибирск": [
    Seller(name: "Сеть суши­-баров «Рыба.Рис»", description: "ул. Ленина, 1"),
    Seller(name: "Сеть суши­-баров «Рыба.Рис»", description: "пл. Калинина, Красный пр-т, 186/1 "),
    Seller(name: "Сеть суши­-баров «Рыба.Рис»", description: "ТПЦ »Сибирский Молл», ул. Фрунзе, 238 (1-й этаж)"),
    Seller(name: "Сеть суши­-баров «Рыба.Рис»", description: "ТРЦ «Аура», ул. Военная, 5 (4-й этаж)"),
    Seller(name: "Сеть суши­-баров «Рыба.Рис»", description: "ТРК «Калина-центр», ул. Дуси Ковальчук, 179/4 (3-й этаж)")
  ],
  "Омск": [
    Seller(name: "Парикмахерская Chop-Chop", description: "ул. Орджоникидзе, 16")
  ],
  "Ростов-на-Дону": [
    Seller(name: "«Киоск»", description: "ул. Суворова, 52а")
  ],
  "Саратов": [
    Seller(name: "Кофейня Love-Coffee", description: "ул. Московская, 157")
  ],
  "Смоленск": [
    Seller(name: "Blackberry Hookah Bar", description: "ул. Пржевальского, 2")
  ],
  "Тула": [
    Seller(name: "ПарикмахерскаяChop-Chop", description: "Учетный пер., 2")
  ],
  "Тюмень": [
    Seller(name: "Книжный магазин «Перспектива»", description: "ул. Челюскинцев, 36"),
    Seller(name: "Dock Store", description: "ул. Максима Горького, 68/7")
  ],
  "Ульяновск": [
    Seller(name: "Парикмахерская Chop­-сhop", description: "ул. Ленина, 89")
  ],
  "Уфа": [
    Seller(name: "Парикмахерская Chop­-сhop", description: "ул. Карла Маркса, 33")
  ],
  "Челябинск": [
    Seller(name: "Интернет-издание Feelmore.ru", description: "ул. Клары Цеткин, 11, корп. 2")
  ]
]
Получившийся порядок
ddadb4eaa4ce4abc81b193c672879736.png
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
ManWithBear
@ManWithBear
Swift Adept, Prague
Ни как. Словарь, как структура данных, не гарантирует сохранности порядка данных.
Возможно сделать вот так:
NSArray *keys = [dict allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [(NSString*)obj1 compare:(NSString*)obj2];
}];
for (NSString *key in sortedKeys) {
    // your actions
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы