Objective C 可区分数据源的可散列对象
Objective C Hashable object for Diffable Data Source
我正在尝试在 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
我的模型对象需要采用什么协议?
MyItemType.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
来自declaration:
class UICollectionViewDiffableDataSource<SectionIdentifierType, ItemIdentifierType> : NSObject where SectionIdentifierType : Hashable, ItemIdentifierType : Hashable
ItemIdentifierType
只能是 Hashable。 NSObject
已经符合 Hashable
,但是,默认情况下它只比较实例标识(例如指针):
==
调用-isEqual:
,默认-isEqual:
比较self
指针,
hashValue
调用 -hash
,默认 -hash
returns self
指针(转换为 NSUInteger
)。
对于 MyItemType
,作为 NSObject
的子类,仅覆盖 -isEqual:
和 -hash
.
就足够了
一些不错的链接:
- https://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html
- https://nshipster.com/equality/
- Apple Books 中的“Using Swift with Cocoa and Objective-C”一书
我正在尝试在 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
我的模型对象需要采用什么协议?
MyItemType.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
来自declaration:
class UICollectionViewDiffableDataSource<SectionIdentifierType, ItemIdentifierType> : NSObject where SectionIdentifierType : Hashable, ItemIdentifierType : Hashable
ItemIdentifierType
只能是 Hashable。 NSObject
已经符合 Hashable
,但是,默认情况下它只比较实例标识(例如指针):
==
调用-isEqual:
,默认-isEqual:
比较self
指针,hashValue
调用-hash
,默认-hash
returnsself
指针(转换为NSUInteger
)。
对于 MyItemType
,作为 NSObject
的子类,仅覆盖 -isEqual:
和 -hash
.
一些不错的链接:
- https://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html
- https://nshipster.com/equality/
- Apple Books 中的“Using Swift with Cocoa and Objective-C”一书