使用NSDictionary作为其他NSDictionary的密钥

时间:2014-08-20 22:47:07

标签: ios objective-c

我正在努力实现以下结构:

NSMutableDictionary *dict = [@{} mutableCopy];

NSDictionary *key1 = @{@"id_format": @(1), @"date": @"2014-08-01"};
NSDictionary *key2 = @{@"id_format": @(2), @"date": @"2014-08-02"};

// This runs perfect and can be checked in llvm debugger
// data1 & data2 are NSArray that contain several NSDictionary
[dict setObject:data1 forKey:key1];
[dict setObject:data2 forKey:key2];

// Later, if i try to access dict using another key, returns empty NSArray
NSDictionary *testKey = @{@"id_format": @(1), @"date": @"2014-08-01"}; // Note it's equal to "key1"

for(NSDictionary *dictData in dict[testKey]){
// dictData is empty NSArray
}

// OR

for(NSDictionary *dictData in [dict objectForKey:testKey]){
// dictData is empty NSArray
}

所以问题是,是否可以使用NSDictionary作为密钥。

1 个答案:

答案 0 :(得分:4)

如果某个对象符合NSCopying,则该对象可以用作密钥,并且应该实现hashisEqual:来按值而不是按身份进行比较。

字典遵循为[self count]返回hash的数组约定。所以这是一个非常糟糕的哈希,但它在技术上是有效的。这意味着你的外部字典最终将完成有效的线性搜索,但它可以工作。

字典实现并正确回复isEqual:。他们还实施NSCopying

因此,您可以使用字典作为字典键。