Swift — печать массива в виде таблицы по убыванию

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

Я новичок в Swift и в настоящее время пытаюсь распечатать массив в виде таблицы. Код работает нормально, но он печатается по возрастанию (первая ячейка имеет индекс 0). Есть ли способ распечатать его по убыванию (первая ячейка должна быть последним индексом)?

Поправьте меня, если я ошибаюсь, но я считаю, что это код, отвечающий за таблицу:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let gefahren = gefahreneKm[indexPath.row]
        let dateFinal = date[indexPath.row]

        let cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell") as! TimelineCell

        cell.setDrivenKm(gefahreneKm: gefahren)
        cell.setDate(date: dateFinal)

        return cell
    }
  

Комментарии:

1. Отсортируйте массив, который вы используете для источника данных.

2. @rmaddy Не могли бы вы проиллюстрировать это в ответе ниже? Массив обновляется динамически с помощью пользовательского ввода.

3. Пожалуйста, не редактируйте свой вопрос с решением.

Ответ №1:

Вы можете использовать reversed версию массива.

 let gefahren = gefahreneKm.reversed()[indexPath.row]
let dateFinal = date.reversed()[indexPath.row]
  

Однако я не обязательно рекомендую это делать. Вероятно, вам следует изменить массив при его первом создании. Либо это, либо создайте вспомогательную функцию для получения значения по пути индекса, чтобы вы не забыли в какой-то момент перевернуть массив.

 func gefahren(at indexPath: IndexPath) -> Gefahren {
    return gefahreneKm.reversed()[indexPath.row]
}
  

Недостатком является то, что в этом контексте reversed() фактически будет создан новый, обратный массив, вместо того, чтобы возвращать вам ReversedCollection (поскольку он не может быть проиндексирован Int ), поэтому производительность будет плохой. Лучше всего просто изменить в начале.

Комментарии:

1. Спасибо! Я добавил свой рабочий код к первоначальному вопросу.

2. Сортируйте массив один раз, когда он загружен или обновлен, а не для каждого отдельного доступа. Кроме того, вы размещаете логику там, где ей не место. Что, если пользователь может выбрать порядок представления таблицы? Добавление reversed при каждом доступе неэффективно и препятствует гибкости.

Ответ №2:

Это не обязательно самый эффективный способ сделать это, но, не видя остальной части кода, он должен заставить вас работать:

 let gefahreneKmIndex = gefahreneKm.count - 1 - indexPath.row
let dateFinalIndex = date.count - 1 - indexPath.row

let gefahren - gefahreneKm[gefahreneKmIndex]
let dateFinal = date[dateFinalIndex]
  

В качестве альтернативы, вы могли бы забыть код, который я включил выше, и просто перевернуть массив, где бы вы ни устанавливали его содержимое, используя встроенный в Swift reversed() метод. Вот простой пример:

 let arr = Array([0, 1 ,2 ,3].reversed()) // This will be ordered as [3, 2, 1, 0]
  

Вы НЕ хотели бы делать это внутри func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {...} , потому что он вызывается так часто. Это было бы крайне неэффективно.

Комментарии:

1. Спасибо за помощь! Я добавил свой рабочий код к первоначальному вопросу — относительно эффективности — приемлем ли мой подход?