Я пытаюсь создать пользовательский NSMutableSet
, который не использует стандартные isEqual:
и hash
селекторами на объектах.NSMutableSet с пользовательскими isEqual: и обратные вызовы hash
Обычно я хочу использовать это с Parse. У меня есть NSMutableSet
, содержащий PFObject
экземпляры подкласса, и я считаю их равными, если они имеют одинаковые objectId
. Я знаю, что могу переопределить isEqual:
и hash
в моем подклассе PFObject
, но я не хочу эту функциональность на всех моих объектах. Кроме того, Parse использует эти методы внутри себя, поэтому я не хочу их испортить.
Вот что я придумал до сих пор:
#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()
.
Как создать подкласс NSObject, который использует NSMutableSet. Таким образом, вы можете перенаправить большинство функций на набор и просто сделать свою собственную равную функцию и прочее ... – Fogmeister