Objective-C:使用自定义对象键从NSMutableDictionary获取值

时间:2011-09-20 05:43:07

标签: objective-c object dictionary nsmutabledictionary

我一直使用NSDictionaries和字符串作为键,几乎所有的例子都在web / books / etc上。是相同的。我想我会用一个自定义对象来尝试它。我已经阅读了实现“copyWithZone”方法并创建了以下基本类:

@interface CustomClass : NSObject
{
    NSString *constString;
}

@property (nonatomic, strong, readonly) NSString *constString;

- (id)copyWithZone:(NSZone *)zone; 

@end

@implementation CustomClass

@synthesize constString;

- (id)init
{
    self = [super init];
    if (self) {
        constString = @"THIS IS A STRING";
    }
    return self;
}

- (id)copyWithZone:(NSZone *)zone
{
    CustomClass *copy = [[[self class] allocWithZone: zone] init];
    return copy;
}

@end

现在我试图只使用一个简单的字符串值添加其中一个对象,然后将字符串值返回以登录到控制台:

CustomClass *newObject = [[CustomClass alloc] init];
NSString *valueString = @"Test string";
NSMutableDictionary *dict =
[[NSMutableDictionary alloc] initWithObjectsAndKeys:valueString, newObject, nil];

    NSLog(@"Value in Dictionary: %@", [dict objectForKey: newObject]);
    // Should output "Value in Dictionary: Test string"

不幸的是,日志显示(null)。我很确定我错过了一些非常明显的东西,觉得我需要另一双眼睛。

2 个答案:

答案 0 :(得分:7)

NSDictionary个关键对象可以使用三种方法:

  • -(NSUInteger)hash
  • -(BOOL)isEqual:(id)other
  • -(id)copyWithZone:(NSZone*)zone

NSObjecthash的默认isEqual:实现仅使用对象的指针,因此当您通过copyWithZone:复制对象时,副本和原始对象不再相等。

你需要的是这样的东西:

@implementation CustomClass

-(NSUInteger) hash;
{
    return [constString hash];
}

-(BOOL) isEqual:(id)other;
{
    if([other isKindOfClass:[CustomClass class]])
        return [constString isEqualToString:((CustomClass*)other)->constString];
    else
        return NO;
}
- (id)copyWithZone:(NSZone *)zone
{
    CustomClass *copy = [[[self class] allocWithZone: zone] init];
    copy->constString = constString; //might want to copy or retain here, just incase the string isn't a constant
    return copy;
}

@end

从文档中找到它有点困难。 overview for NSDictionary会告诉您isEqual:NSCopying

  

在字典中,键是唯一的。也就是说,没有两把钥匙   单字典是相等的(由isEqual :)确定。一般来说,一个   key可以是任何对象(前提是它符合NSCopying   协议 - 见下文),但请注意,当使用键值编码时   必须是一个字符串(参见“键值编码基础”)。

如果您查看documentation for -[NSObject isEqual:],它会告诉您hash

  

如果两个对象相等,则它们必须具有相同的哈希值。这个   如果你定义isEqual:在a中,最后一点尤为重要   子类并打算将该子类的实例放入   采集。确保您还在子类中定义哈希。

答案 1 :(得分:0)

我认为你的班级需要定义:

- (BOOL)isEqual:(id)anObject

这就是字典可能用来确定你的密钥是否等于字典中已经使用的密钥。