CollectionView Compositional Layout with Multiple Data Types

n1s*_*hal 5 collectionview diffabledatasource

So I've just recently playing around with Compositional Layouts with Diffable DataSource and so far loving it. But all of my endeavors have included a single type of Data Item.

What I'm trying to achieve is have two different types of List, say Car and Airplane

So far what I've done is created the layouts, created an Enum

enum DataItem: Hashable{
        case cars(Car)
        case airplane(Airplane)
 }
Run Code Online (Sandbox Code Playgroud)

And dataSource initialization:

func configureDataSource(){
        dataSource = UICollectionViewDiffableDataSource
        <Section, DataItem>(collectionView: collectionView) {
            (collectionView: UICollectionView, indexPath: IndexPath, dataItem: DataItem) -> UICollectionViewCell in

            switch dataItem {
            case .cars(let car):
                guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CarCell.reuseIdentifier, for: indexPath) as? CarCell else {fatalError("Couldn't Create New Cell")}
                ....
                return cell
            case .airplanes(let airplane):
                guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: AirplaneCell.reuseIdentifier, for: indexPath) as? AirplaneCell else {
                    fatalError("Couldn't Create New Cell")
                }
                ....
                return cell
            }
        }
        dataSource.apply(snapshotForCurrentState(), animatingDifferences: false)
    }
Run Code Online (Sandbox Code Playgroud)

Now the part that I'm stuck is creating the snapshot.

Ideally what I'd like to do is

func snapshotForCurrentState() -> NSDiffableDataSourceSnapshot<Section, DataItem>{
    var snapshot = NSDiffableDataSourceSnapshot<Section, DataItem>()
    snapshot.appendSections(Section.allCases)
    snapshot.appendItems([cars], toSection: Section.cars)
    snapshot.appendItems([airplanes], toSection: Section.airplanes)
    return snapshot
}
Run Code Online (Sandbox Code Playgroud)

Any pointers as to how to achieve this? Thanks in advance! What am I missing here?

Ben*_*man 9

你走在正确的道路上。您缺少的部分是您需要使用您创建的聚合类型创建快照DataItem

func snapshotForCurrentState() -> NSDiffableDataSourceSnapshot<Section, DataItem>{
    var snapshot = NSDiffableDataSourceSnapshot<Section, DataItem>()
    snapshot.appendSections(Section.allCases)

    let carItems = cars.map { DataItem.car($0) }
    snapshot.appendItems(carItems, toSection: Section.cars)

    let airplaneItems = airplanes.map { DataItem.airplane($0) }
    snapshot.appendItems(airplaneItems, toSection: Section.airplanes)
    return snapshot
}

Run Code Online (Sandbox Code Playgroud)