0

我有一个字典数组[[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

现在我想将键分配给表格部分和值作为数组中的表格单元格文本。

4

1 回答 1

4

这是非常繁琐的代码。

强烈建议您至少与成员一起使用结构而不是字典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 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
于 2019-01-18T18:01:18.440 回答