一般情况下用字典的时候,都是用NSString做为字典的key,其实key可以自定义的,只要是NSObject类型的就可以当key.
今天介绍一下如何自定义key.
首先当然是继承NSObject,如
@interface CustomKey : NSObject
- (id)initWithApp:(NSString *)appId_ type:(NSString *)formType_;
@property (nonatomic, retain) NSString *appId;
@property (nonatomic, retain) NSString *formType;
@end
然后实现是:
@implementation CustomKey
@synthesize appId = _appId ;
@synthesize formType = _formType;
+ (void)initialize {
}
- (id)initWithApp:(NSString *)appId_ type:(NSString *)formType_{
if ((self = [super init])) {
self.appId = appId_;
self.formType = formType_;
}
return self;
}
- (void)dealloc {
self.appId = nil;
self.formType = nil;
[super dealloc];
}
- (id)copyWithZone:(NSZone *)zone {
return [[[self class] allocWithZone:zone] initWithApp:_appId type:_formType];
}
- (BOOL)isEqual:(id)object_ {
BOOL eAId = [_appId isEqualToString:[object_ valueForKey:@"appId"]];
BOOL eType = [_formType isEqualToString:[object_ valueForKey:@"formType"]];
return eAId & eType;
}
- (NSUInteger)hash {
return [_appId hash] ^ [_formType hash];
}
- (NSString *)description {
return [NSString stringWithFormat:@"key:appid=%@, type=%@", _appId, _formType];
}
@end
其中hash ,isEqual与copyWithZone一定得重写。因为在比较两个key的时候系统会自动调用判断两个instance是否相等。不同值可能hash会相等,所以需要重写更为复杂的hash方法,在下面参看文档中有介绍。
这样你就可以用CustomKey做为字典的key了, 每个key还有两个变量,这样可以与数据库中的主键对应起来。哈哈,爽。
参看文档:http://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html