现在的位置: 首页 > 综合 > 正文

如何自定义字典中的key

2014年08月29日 ⁄ 综合 ⁄ 共 1289字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.