我是Swift的初学者,我曾尝试根据本教程https://www.ioscreator.com/tutorials/indexed-table-view-ios-tutorial-ios11制作一个Indexed table view
,但我有一些疑问,我想问些什么。到目前为止,这是我的代码:
for car in cars {
let carKey = String(car.prefix(1))
if var carValues = carsDictionary[carKey] {
carValues.append(car)
carsDictionary[carKey] = carValues
} else {
carsDictionary[carKey] = [car]
}
}
// 2
carSectionTitles = [String](carsDictionary.keys)
carSectionTitles = carSectionTitles.sorted(by: { $0 < $1 })
首先,我要确保这一行
if var carValues = carsDictionary[carKey]
从carsDictionary
提取所有以word(carKey)开头的汽车,并将其存储到数组中。如果为真,则将下一辆车存储到数组中,然后将其放回字典中。正确吗?
不幸的是,我不明白这行在做什么
carSectionTitles = [String](carsDictionary.keys)
此外,我不确定此功能,主要是“配置单元格”部分
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 3
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
// Configure the cell...
let carKey = carSectionTitles[indexPath.section]
if let carValues = carsDictionary[carKey] {
cell.textLabel?.text = carValues[indexPath.row]
}
return cell
}
它像循环一样工作吗?我不确定indexPath.section
。有人可以解释吗?预先谢谢你。
答案 0 :(得分:1)
创建字典的方法是正确的,但是在Swift 4中,有一种更方便的方法
carsDictionary = Dictionary(grouping: cars, by: {$0.prefix(1)})
行carSectionTitles = [String](carsDictionary.keys)
创建一个字典键数组(前缀字母)。可以用更有效的方式写这行和下一行对数组进行排序:
carSectionTitles = carsDictionary.keys.sorted()
IndexPath
有两个组成部分,section
和row
。这些部分用carSectionTitles
表示,字典中的键和行是字典中的值。 cellForRowAt
每行调用一次。该代码从carSectionTitles
获取该部分,并从字典中获取行。实际上不需要可选的绑定,因为可以确保每个字母都有一个关联的数组。
let carKey = carSectionTitles[indexPath.section] // carKey is one of the prefix letters
let carValues = carsDictionary[carKey]! // get the rows
cell.textLabel?.text = carValues[indexPath.row] // get the value for that particular row