Swift对集合的数组一致性

问题描述

给出两个符合RandomModelObject的数组,它们符合Codable,Equatable和Hashable,我想计算它们之间的差异并为UICollectionView中的内容更改设置动画。必须支持iOS 11使得我选择https://github.com/tonyarnold/Differ作为这样做的依赖。

代码

class ScreenNameCollectionViewDataSource {
    var elements: [RandomModelObject] = []
}

extension ScreenNameViewController: ScreenNameviewmodelDelegate {
    func elementsstoreUpdated() {
        collectionView.animateItemAndSectionChanges(oldData: dataSource.elements,newData: viewmodel.blablabla,updateData: {
            dataSource.elements = viewmodel.blabla
        })
    }
}

产生2个错误

Instance method 'animateItemAndSectionChanges(oldData:newData:indexPathTransform:sectionTransform:updateData:completion:)' requires that 'RandomModelObject.Element' conform to 'Equatable'

Instance method 'animateItemAndSectionChanges(oldData:newData:indexPathTransform:sectionTransform:updateData:completion:)' requires that 'RandomModelObject' conform to 'Collection'

错误似乎没有指向我任何地方-数组是一个集合,并且该模型符合Equatable。我在那里想念任何东西吗?

解决方法

您正在使用animateItemAndSectionChanges,这不仅要求TCollection,而且还要求T的元素是Collection 。换句话说,T必须类似于2D数组。

这是因为animateItemAndSectionChanges同时处理行和节。 2D集合将告诉该方法新旧的行和节是什么。每个“内部”集合都代表一个部分。

由于您的数据源是一维数组,因此似乎只需要animateRowChanges(用于单节表视图)即可。

如果每个RandomModelObject实际上代表一个 section ,那么您需要将其中的每个map放入一个数组中,以便得到一个[[Something]],并相应地更改updateData闭包。