Сортировка вложенного словаря в Swift4 по ключу - PullRequest
0 голосов
/ 21 марта 2019

В настоящее время у меня есть вложенный словарь, объявленный как

var userSchedule = [String:[String:String]]()

Я получаю результаты как:

["2": ["time": "tbd", "date": "1/15", "name": "Chris"], 
 "0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"], 
 "1": ["time": "1:15PM", "date": "1/15", "name": "John"]]

Я хочу отсортировать этот результат так, чтобы результаты были в порядке по первому ключу.

Итак:

["0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"], 
 "1": ["time": "1:15PM", "date": "1/15", "name": "John"], 
 "2": ["time": "tbd", "date": "1/15", "name": "Chris"]]

Как я мог эффективно сделать это в Swift4? Пожалуйста, помогите!

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

Создать структуру для хранения значений и сопоставить ваш словарь с массивом этой структуры

struct Schedule {
    let key: Int?
    let time: String?
    let date: String?
    let name: String?
}

var orderedSchedule = userSchedule.map { Schedule(key: Int($0.key), 
                                                  time: $0.value["time"], 
                                                  date: $0.value["date"], 
                                                  name: $0.value["name"]) }

orderedSchedule.sort { ($0.key ?? 0) < ($1.key ?? 0) }
0 голосов
/ 22 марта 2019

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

var userSchedule = ["2": ["time": "tbd", "date": "1/15", "name": "Chris"],
"0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"],
"1": ["time": "1:15PM", "date": "1/15", "name": "John"]]

let userScheduleArray = userSchedule.sorted{$0.key < $1.key}

print(userScheduleArray) 
//[(key: "0", value: ["time": "6:16 PM", "date": "1/15", "name": "Bob"]), (key: "1", value: ["time": "1:15PM", "date": "1/15", "name": "John"]), (key: "2", value: ["time": "tbd", "date": "1/15", "name": "Chris"])]

let separatedDict = userScheduleArray.map{Dictionary(uniqueKeysWithValues: [$0])}

print(separatedDict)
//[["0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"]], 
// ["1": ["time": "1:15PM", "date": "1/15", "name": "John"]], 
// ["2": ["time": "tbd", "date": "1/15", "name": "Chris"]]]

print(type(of: separatedDict))
//[[String:[String:String]]] i.e. Array<Dictionary<String, Dictionary<String, String>>> 
0 голосов
/ 22 марта 2019

Dictionary неупорядочен, вы не можете его отсортировать.


Но в вашем случае я избавился бы от словаря и у меня был бы только массив вашей модели.

Создайте пользовательский struct, который будет представлять ваше событие, а затем вы можете отсортировать свой массив по id свойству модели

struct Event {
    let time, date, name: String
    let id: Int
}

var userSchedule = [Event(time: "tbd", date: "1/15", name: "name", id: 2),
                    Event(time: "6:16 PM", date: "1/15", name: "Chris", id: 0),
                    Event(time: "1:15PM", date: "1/15", name: "John", id: 1)]

userSchedule.sort { $0.id < $1.id }

Если вы, например, получаете свой словарьв качестве ответа от сервера вы можете использовать compactMap, чтобы переназначить его в массив Event

struct Event {
    let time, date, name: String
    let id: Int
}

var userSchedule = ["2": ["time": "tbd", "date": "1/15", "name": "Chris"],
                    "0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"],
                    "1": ["time": "1:15PM", "date": "1/15", "name": "John"]]

var schedule = userSchedule.compactMap { (event) -> Event? in
    guard let time = event.value["time"], let date = event.value["date"], let name = event.value["name"], let id = Int(event.key) else { return nil }
    return Event(time: time, date: date, name: name, id: id)
}

schedule.sort { $0.id < $1.id }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...