Objective c ObjC:NSDictionary allKeysForObject*包含*(这可能吗?)

Objective c ObjC:NSDictionary allKeysForObject*包含*(这可能吗?),objective-c,nsdictionary,Objective C,Nsdictionary,我对objective-C非常陌生,遇到了NSDictionary方法allKeysForObject:。看起来很有用。但是,我有一个NSDictionary,它有几个NSarray(全部长度为2),并由NSString设置键。基本上,键是项,数组定义了它们的两个属性。如果我想提取所有具有特定属性的项名称,可以使用类似于allKeysForObject的方法来实现,还是应该循环字典并生成一个可变数组(似乎效率很低) 我想包括一个代码片段,但我觉得这个问题是概念性的,以至于代码不能真正澄清任何事情

我对objective-C非常陌生,遇到了NSDictionary方法
allKeysForObject:
。看起来很有用。但是,我有一个NSDictionary,它有几个NSarray(全部长度为2),并由NSString设置键。基本上,键是项,数组定义了它们的两个属性。如果我想提取所有具有特定属性的项名称,可以使用类似于
allKeysForObject
的方法来实现,还是应该循环字典并生成一个可变数组(似乎效率很低)

我想包括一个代码片段,但我觉得这个问题是概念性的,以至于代码不能真正澄清任何事情。哦,见鬼。下面是一些简化的代码:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:2],nil],@"Car",[NSArray arrayWithObjects:[NSNumber numberWithInt:2],[NSNumber numberWithInt:3],nil],@"Boat",nil];
NSLog(@"%@",[dict allKeysForObject:???]); // this is the line I am not at all sure about.

编辑:感谢您到目前为止的回复。不过,我不清楚我的问题。我正在寻找一种方法来做一些更一般的事情。我不想检索特定对象的所有键,比如
[1,2]
,但我想在字典中查找所有数组,包括NSNumber 1并返回这些键。因此,如果我添加了
@“Plane”[NSArray array with objects:[NSNumber numberwhithint:1],[NSNumber numberwhithint:3],nil]
,我想以某种方式查询NSNumber 1并获得
@“Car”
@“Plane”
。我感觉到这不是设计此方法的目的。

在您的示例中,如果您调用

[dict allKeysForObject: [NSArray arrayWithObjects: 
                            [NSNumber numberWithInt:2],
                            [NSNumber numberWithInt:3],
                            nil]]]

您应该得到一个数组,其中只包含您要查找的@“Boat”

-keysOfEntriesPassingTest:

NSArray * selectedKeys = [dict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
                          {
                              return [obj containsObject:[NSNumber numberWithInt:2]];
                          }];

谢谢,我明白了。是否也可以仅在其中一个元素上进行匹配?基本上,我想匹配一类包含NSNumber 2的对象,例如。理想情况下,此匹配与位置无关,因此它将与阵列中的任意位置的NSNumber 2匹配。否。allKeysForObject应该返回映射到同一对象的所有键(在isEqual的意义上,而不是在具有相同地址的意义上)。如果你想按你说的去做,你需要存储一些不同于NSArray的东西。创建自己的类并根据需要定义isEqual。或者使用EntriesPassingTest:键或带有选项的Entries键:passingTest:好的,谢谢,这很有意义。我试图理解InteriesPassingTest的
键,但这意味着理解块,这只是复杂性的另一个层次。我对你所说的重新定义isEqual很感兴趣。你是说,如果我不是以数组的形式存储属性,而是创建了一个“item”类,那么我可以用包含当前数组的item对象填充字典,并使用isEqual进行我想要的比较?不过,正如你所说,我想要的并不是真正的“平等”局面。我只想提取具有特定属性的项名称。allKeysForObject假定您对相等情况感兴趣。当然,如果您定义了一个类,那么它的两个实例是否相等完全取决于您:只需相应地实现isEqual。我确实明白积木是另一种需要学习的东西。但这是目前做我认为你想做的事情的最佳实践。啊哈!这看起来不错!谢谢你,我需要玩它,但是谢谢你给我指出了正确的方向!