Как отсортировать массив словарных массивов - PullRequest
1 голос
/ 14 апреля 2020

Я получаю categories из своей базы данных с этим кодом:

db.collection(DatabaseRef.categories).document(DatabaseRef.categoriesDoc).getDocument { snap, error in

            guard error == nil, let snap = snap else {
                return
            }

            let data = snap.data()!

            for (k,v) in data {
                self.categories.append([Int(k) ?? 0 : v])
            }

            self.categoryCollectionView.reloadData()
        }

Вот моя переменная категории:

var categories: [[Int: Any]] = []
// categories = [[1: "category1"], [3: "category3"], [2: "category2"]]

Я хочу отсортировать categories перед перезагрузкой мой сборник Поэтому категории должны выглядеть следующим образом:

// categories = [[1: "category1"], [2: "category2"], [3: "category3"]]

Я пробовал следующее:

let sortedCategories = categories.sorted{ $0.key > $1.key}

Но я получаю эту ошибку: Unable to infer closure type in the current context

1 Ответ

2 голосов
/ 14 апреля 2020

Поскольку categories представляет собой массив словарей, $0 и $1 являются словарями [Int: Any], а не парами значений ключа (key: Int, value: Any), хотя каждый из них содержит ровно одну пару значений ключа .

Таким образом, один из способов доступа к одной-единственной паре ключ-значение в каждом словаре - .keys.first!.

categories.sorted(by: { $0.keys.first! < $1.keys.first! })

Честно говоря, я не думаю, что [[Int: Any]] является подходящей структурой данных для categories. Если дубликатов k нет, просто используйте [Int: Any]. И вы вставили бы данные следующим образом:

for (k,v) in data {
    self.categories[[Int(k) ?? 0] = v
}

Вы можете использовать исходный код, который вы использовали для сортировки:

categories.sorted{ $0.key > $1.key }

И после сортировки вы получите [(key: Int, value: Any)].

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