Индексированное табличное представление - PullRequest
0 голосов
/ 30 октября 2018

Я новичок в Swift, я пытался сделать Indexed table view в соответствии с этим уроком: https://www.ioscreator.com/tutorials/indexed-table-view-ios-tutorial-ios11,, но у меня есть некоторые сомнения, и я хотел бы кое-что спросить. Вот мой код:

 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]

принимает все машины, начинающиеся со слова (carKey) из carsDictionary, и сохраняет их в массив. Если это правда, он сохраняет следующую машину в массив и помещает ее обратно в словарь. Это правильно?

К сожалению, я не понимаю, что делает эта строка

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. Может кто-нибудь объяснить это? Заранее спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Способ создания словаря правильный, но в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...