我正在做一个数组,并试图将其放入索引列表和字母顺序,但出现错误。
这是我的twoDimensionalArray
var contacts = [
ExpandableNames(isExpanded: true, names: ["Hong Kong", "Bangkok, Thailand", "London, UK", "Singapore", "Bali, Indonesia"].map{ Contact(name: $0, hasFavorited: false) }),
]
这是错误。请帮忙弄不清楚如何解决
func createContactDict() {
for contact in contacts {
// Get the first letter of the contact name and build the dictionary
let firstLetterIndex = contacts.index(contacts.startIndex, offsetBy: 1)
let contactKey = String(contacts[..<firstLetterIndex])
if var contactValues = contactsDict[contactKey] {
contactValues.append(contacts)
contactsDict[contactKey] = contactValues
} else {
contactsDict[contactKey] = [contact]
}
}
以下是与UITableViewDataSource相关的代码
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let contactKey = contactSectionTitles[section]
guard let contactValues = contactsDict[contactKey] else { return 0 }
return contactValues.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! ContactCell
cell.link = self
let contact = contacts[indexPath.section].names[indexPath.row]
cell.textLabel?.text = contact.name
cell.accessoryView?.tintColor = contact.hasFavorited ? UIColor.red : .lightGray
if showIndexPaths {
cell.textLabel?.text = "\(contact.name) Section:\(indexPath.section) Row:\(indexPath.row)"
}
// Configure the cell...
return cell
}
答案 0 :(得分:0)
如果我正确理解了您想要实现的目标,则可以分两行完成:
func createContactDict() {
let contactNames = Array(contacts.map { $0.names }.joined())
contactsDict = Dictionary(grouping: contactNames, by: { String($0.name.prefix(1)) })
}
第一行将[ExpandableNames]
转换为[Contact]
第二行创建字典,其中的键被描述为名称String($0.name.prefix(1))
的首字母。
关于您的UITableViewDatasource问题,我想您需要转到方法tableView(_ tableView:, cellForRowAt:)
并更改以下行:
let contact = contacts[indexPath.section].names[indexPath.row]
进入:
let contactKey = contactSectionTitles[indexPath.section]
let contact = contactsDict[contactKey][indexPath.row]