UITableViewDiffableDataSource 和 UICollectionViewDiffableDataSource 在使用 class 与 struct 时工作方式不同

Posted

技术标签:

【中文标题】UITableViewDiffableDataSource 和 UICollectionViewDiffableDataSource 在使用 class 与 struct 时工作方式不同【英文标题】:UITableViewDiffableDataSource and UICollectionViewDiffableDataSource working different when class vs struct is used 【发布时间】:2020-05-12 14:48:32 【问题描述】:

我注意到,在使用 UITableViewDiffableDataSource / UICollectionViewDiffableDataSource 时,ItemIdentifierType

使用时

var managedDataSource: UITableViewDiffableDataSource<String, StringCellObject>!

class StringCellObject: Hashable 

    let value: String

    func hash(into hasher: inout Hasher) 
        hasher.combine(value)
    

    static func == (lhs: StringCellObject, rhs: StringCellObject) -> Bool 
        return lhs.value == rhs.value
    

    init(value: String) 
        self.value = value
    


StringCellObject是一个类时,甚至不调用Hashable函数,对象总是被视为Changed(即使值相同)

当我将类更改为结构时

struct StringCellObject: Hashable 

我得到了正确的行为

为什么在使用类时行为会发生变化以及如何获得预期的行为?

【问题讨论】:

【参考方案1】:

我认为你必须实现 Hashable 方法 如下所示。

class Item: Hashable 
    
    static func == (lhs: Item, rhs: Item) -> Bool 
        lhs.id == rhs.id
    

    func hash(into hasher: inout Hasher) 
        hasher.combine(id)
    
    
    let id = UUID()

【讨论】:

以上是关于UITableViewDiffableDataSource 和 UICollectionViewDiffableDataSource 在使用 class 与 struct 时工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章