我正在尝试创建一个NSMutableSet
不使用对象上的标准isEqual:
和hash
选择器的自定义。
通常我想将它与 Parse 一起使用。我有一个NSMutableSet
包含PFObject
子类实例,如果它们具有相同的objectId
. 我知道我可以在我的子类中覆盖isEqual:
和,但我不希望我的所有对象都具有该功能。此外,Parse 在内部使用这些方法,所以我不想弄乱它们。hash
PFObject
这是我到目前为止提出的:
#import <Foundation/Foundation.h>
@interface NSMutableSet (Additions)
+ (NSMutableSet *)setWithParseObjectIdIsEqualCallback;
@end
#import "NSMutableSet+Additions.h"
@implementation NSMutableSet (Additions)
static Boolean ParseObjectIdIsEqualCallback(const void *value1, const void *value2)
{
PFObject *obj1 = (__bridge id)value1;
PFObject *obj2 = (__bridge id)value2;
NSCParameterAssert([obj1 isKindOfClass:PFObject.class]);
NSCParameterAssert([obj2 isKindOfClass:PFObject.class]);
NSCParameterAssert([obj1 isMemberOfClass:obj2.class]);
return [obj1.objectId isEqualToString:obj2.objectId];
}
static CFHashCode ParseObjectIdHashCallback(const void *value)
{
PFObject *object = (__bridge id)value;
NSCParameterAssert([object isKindOfClass:PFObject.class]);
return object.objectId.hash;
}
+ (NSMutableSet *)setWithParseObjectIdIsEqualCallback
{
CFSetCallBacks callbacks = kCFTypeSetCallBacks;
callbacks.equal = ParseObjectIdIsEqualCallback;
callbacks.hash = ParseObjectIdHashCallback;
CFMutableSetRef set = CFSetCreateMutable(kCFAllocatorDefault, 0, &callbacks);
return CFBridgingRelease(set);
}
@end
我真的不知道它是否会起作用或者是否可以安全使用,而且我对 Core Foundation 对象和函数(如CFBridgingRelease()
.