Swift 的数组符合集合

Swift's Array conformance to Collection

给定两个符合 Codable、Equatable 和 Hashable 的 RandomModelObject 数组,我想计算它们之间的差异并在 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'

这些错误似乎没有指出任何地方 - Array 是一个 Collection 并且模型符合 Equatable。我错过了什么吗?

您正在使用 animateItemAndSectionChanges,这不仅要求 TCollection,而且还要求 T 的元素是 Collections。换句话说,T 需要类似于二维数组。

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

由于您的数据源是一维数组,看来您只需要 animateRowChanges,这是 single-section table 视图。

如果每个 RandomModelObject 实际上代表一个 部分 ,那么你需要 map 每个 RandomModelObject 一个数组,这样你就可以得到一个 [[Something]],并相应地更改 updateData 闭包。