Ios 将NSDictionary用作其他NSDictionary';s键
我试图实现以下结构:Ios 将NSDictionary用作其他NSDictionary';s键,ios,objective-c,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 debugg
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用作键。如果对象符合
NSCopying
,则可以将其用作键,并且应该实现哈希和isEqual:
,以便按值而不是按标识进行比较
对于散列
,字典遵循返回[self count]
的数组约定。这是一个很糟糕的散列,但在技术上是有效的。这意味着您的外部字典最终将执行有效的线性搜索,但它会起作用
字典实现并正确响应isEqual:
。它们还实现了NSCopying
因此,您可以将字典用作字典键。如果对象符合NSCopying
,则可以将其用作键,并且应该实现哈希
和isEqual:
以按值而不是按标识进行比较
对于散列
,字典遵循返回[self count]
的数组约定。这是一个很糟糕的散列,但在技术上是有效的。这意味着您的外部字典最终将执行有效的线性搜索,但它会起作用
字典实现并正确响应isEqual:
。它们还实现了NSCopying
因此,您可以使用字典作为字典键。因此它们“可以”被使用,但结果不是预期的结果。感谢结果完全符合界面的要求。如果你的所有键都是具有相同项数的字典,不要认为你得到的是hashmap。因此它们“可以”被使用,但结果并不是你想要的。感谢结果完全符合界面的要求。如果所有键都是具有相同项数的字典,那么不要认为您得到的是hashmap。我认为data1
和data2
是nil
,因为我已经测试了您的代码,它工作得很好。您确定key1
和testKey
是相等的吗?它们有相同的组件,但不是相同的目标这似乎是个坏主意。我认为data1
和data2
是nil
,因为我已经测试了你的代码,它工作得很好。你确定key1
和testKey
是相等的吗?它们有相同的组件,但不是相同的目标这似乎是个坏主意。