Назначьте ключи и значения из [(key: String, value: [[String: Any]])] в UITableView - PullRequest
0 голосов
/ 18 января 2019

У меня есть массив словарей, [[String:AnyObject]], который уменьшен + отсортирован, как показано ниже.

 var arrUserList = [(key: String, value: [[String : Any]])]()


 let result = self.arrJsonDict.reduce(into: [String: [[String:Any]]]()) { result, element in
                    let strName: String = (element as! NSDictionary).value(forKey: "name") as! String
                    if let firstLetter = strName.first {
                        let initial = String(describing: firstLetter).uppercased()
                        result[initial, default: [[String:Any]]() ].append(element as! [String : Any])
                    }}.sorted { return $0.key < $1.key }


     self.arrUserList = result

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

1 Ответ

0 голосов
/ 18 января 2019

Это очень громоздкий код.

Вам настоятельно рекомендуется использовать структуру, а не словарь, по крайней мере, с членом name

struct Person {
    let name : String
} 

Объявить и переименовать arrJsonDic (более наглядно) как

var people : [Person]()

и arrUserList как

var users = [String: [Person]]()

Для разделов объявляем другой массив

var letters = [String]()

Сгруппируйте массив и заполните letters просто

users = Dictionary(grouping: people, by: { String($0.name.first!) })
letters = users.keys.sorted()

В табличном представлении в numberOfSections return

return letters.count

и в numberOfRows возврат

let letter = letters[section]
return users[letter]!.count

В cellForRowAt назначить имя метке с помощью

let letter = letters[indexPath.section]
let user = users[letter]![indexPath.row]
cell.nameLabel.text = user.name

------------------------------

Чтобы сделать это все еще быстрее объявить вторую структуру Section

struct Section {
    let index : String
    let people : [Person]
}

удалить

var letters = [String]()

и объявить users

var users = [Section]()

Группировка немного отличается

let grouped = Dictionary(grouping: people, by: { String($0.name.first!) })
users = grouped.map({ Section(index: $0.0, people: $0.1) }).sorted{$0.index < $1.index}

Код в трех методах делегата табличного представления

return users.count

-

return users[section].people.count

-

let user = users[indexPath.section].people[indexPath.row]
cell.nameLabel.text = user.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...