一般情况下用字典的时候,都是用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