0

我正在尝试在 Objective C 中实现一个带有可区分数据源的集合视图。我知道对于 Swift,UICollectionViewDiffableDataSource 的泛型类型是同时符合 Hashable 和 Identifiable 协议的类型。但我不知道这些对应于Objective C。

所以我的问题是我是否有这样的数据源属性:

@property (strong, nonatomic) UICollectionViewDiffableDataSource<NSString *, MyItemType *> *dataSource;

那么我需要实施什么MyItemType才能使其正常工作?仅实现以下方法是否足够,或者这些方法不正确,我需要为 Objective C 实现其他方法?

  • - (BOOL)isEqual:(id)object
  • - (NSUInteger)hash
  • - (NSComparisonResult)compare:(MyItemType *)other

我需要为我的模型对象采用什么协议?

我的项目类型.h

这是模型项的定义。这些显示在集合视图列表布局中。

@interface MyItemType : NSObject

@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic, nullable) NSString *subtitle;
@property (strong, nonatomic, nullable) NSArray<MyItemType *> *children;
@property (strong, nonatomic, nullable) UIImage *image;

@end
4

1 回答 1

2

声明中:

class UICollectionViewDiffableDataSource<SectionIdentifierType, ItemIdentifierType> : NSObject where SectionIdentifierType : Hashable, ItemIdentifierType : Hashable

ItemIdentifierType只能是可散列的。NSObject已经符合Hashable,但默认情况下它只比较实例标识(例如指针):

  • ==调用-isEqual:,默认-isEqual:比较self指针,
  • hashValue调用-hash,默认-hash返回self指针(转换为NSUInteger)。

因为MyItemType,作为它的子类,只覆盖和NSObject就足够了。-isEqual:-hash

一些很好的链接:

于 2021-11-18T19:57:24.847 回答