kayumovtd / DiffableDataSourceDemo

0 stars 0 forks source link

Разные типы ячеек / секций #1

Open EastHell opened 2 years ago

EastHell commented 2 years ago

Предлагаю добавить в код примеры разных типов ячеек / секций. Т.к. из текущего примера пока что понятно только как в целом завести diffableDataSource и заполнить табличку / коллекцию однотипными ячейками, но в реальности чаще сталкиваешься с тем что таблица / коллекция заполняется разношерстными данными.

kayumovtd commented 2 years ago

Согласен, добавлю.

Но тут есть минимум два варианта решения, осталось выбрать, какой более правильный)

  1. Вместо модели ячейки использовать AnyHashable, но тогда придётся кастить:
private typealias DataSource = UICollectionViewDiffableDataSource<Section, AnyHashable>

...

let cellProvider: DataSource.CellProvider = { collectionView, indexPath, itemIdentifier in
    if let city = itemIdentifier as? CityModel {
        // configure cell
        return cell
    }

    if let coutry = itemIdentifier as? CountryModel {
        // configure cell
        return cell
    }

    return nil
}
  1. Сделать перечисление, но тогда придётся мапить:

private enum Item: Hashable {
    case country(CountryModel)
    case city(CityModel)
}

...

private typealias DataSource = UICollectionViewDiffableDataSource<Section, Item>

...

snapshot.appendSections([.countries, .cities])
snapshot.appendItems(filteredCountries.map { .country($0) }, toSection: .countries)
snapshot.appendItems(filteredCitites.map { .city($0) }, toSection: .cities)

...

let cellProvider: DataSource.CellProvider = { collectionView, indexPath, itemIdentifier in
    switch itemIdentifier {
    case let .country(country):
        // configure cell
        return cell

    case let .city(city):
        // configure cell
        return cell
    }

    return nil
}
EastHell commented 2 years ago

Вариант с enum звучит идеально!