joh*_*ohn 5 hash cocoa objective-c nsset
我对Objective-C中的NSMutableSet有一些问题.我了解到NSSet将比较两个对象的哈希码以确定它们是否相同.问题是,我实现了一个NSObject自己的子类.NSString *name该班级有一处房产.我想要做的是当这个自定义类的实例具有相同的变量值"name"时,它们应该是相同的,并且在添加到NSMutableSet时不应该复制这样的相同类.
所以我重写了这个- (NSUInteger)hash函数,调试显示它为我的两个实例返回相同的哈希值obj1, obj2 (obj1.name == obj2.name).但是当我将obj1,obj2添加到a时NSMutableSet,NSMutableSet仍然包含obj1,obj2.
我尝试了两个NSString具有相同值的值,然后将它们添加到NSMutableSet,该集合将只有一个NSString.
可能是什么解决方案?感谢您的任何帮助!
自定义类:Object.h:
#import <Foundation/Foundation.h>
@interface Object : NSObject
@property (retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)
Object.m
@implementation Object
@synthesize name;
-(BOOL)isEqualTo:(id)obj {
return [self.name isEqualToString:[(Object *)obj name]] ? true : false;
}
- (NSUInteger)hash {
return [[self name] hash];
}
@end
Run Code Online (Sandbox Code Playgroud)
主要:
#import <Foundation/Foundation.h>
#import "Object.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Object *obj1 = [[Object alloc]init];
Object *obj2 = [[Object alloc]init];
obj1.name = @"test";
obj2.name = @"test";
NSMutableSet *set = [[NSMutableSet alloc] initWithObjects:obj1, obj2, nil];
NSLog(@"%d", [obj1 isEqualTo:obj2]);
NSLog(@"%ld", [set count]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而不是实现isEqualTo:你必须实现isEqual:
- (BOOL)isEqual:(id)object {
return [object isKindOfClass:[MyObject class]] &&
[self.name isEqual:[(MyObject *)object name]];
}
Run Code Online (Sandbox Code Playgroud)
这将(可能错误地)返回NO如果两个self.name和object.name的nil.如果您想要返回YES两个属性,则nil应该使用
- (BOOL)isEqual:(id)object {
if ([object isKindOfClass:[MyObject class]]) {
return (!self.name && ![(MyObject *)object name]) ||
[self.name isEqual:[(MyObject *)object name]];
}
return NO;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2963 次 |
| 最近记录: |