2012-08-09 76 views
1

我对Objective-C非常陌生,遇到了NSDictionary方法allKeysForObject:。看起来非常有用。但是,我有一个NSDictionary有几个NSArrays(所有长度为2),并由NSStrings键入。基本上,键是项目和阵列定义它们的两个属性。如果我想拉取所有具有特定属性的项目名称,是否可以使用类似allKeysForObject的东西来完成,或者我应该循环遍历字典并生成可变数组(似乎效率低下)。ObjC:NSDictionary 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 arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:3],nil],我想以某种方式查询NSNumber 1并获得@"Car"@"Plane"。我意识到这不是这种方法设计的目的。

回答

5

您正在寻找-keysOfEntriesPassingTest: ...

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

啊哈!这看起来不错!谢谢,我需要玩它,但谢谢你指点我正确的轨道! – 2012-08-09 18:35:51

-2

在您的例子,如果你调用

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

你应该得到一个仅包含一个数组@ “船”

+0

谢谢,我明白这是如何工作的。它也可能只匹配其中一个元素吗?基本上,我想匹配包含NSNumber 2的一类对象,例如。理想情况下,这种匹配将独立于位置,因此它将与阵列中的任何位置的NSNumber 2匹配。 – 2012-08-09 18:29:17

+1

编号。allKeysForObject应该返回映射到同一对象的所有关键字(在isEqual意义上,而不是具有相同地址)。如果你想做你说的话,你需要存储一些不同于NSArray的东西。根据需要创建自己的类并定义isEqual。或者使用keysOfEntriesPassingTest:或keysOfEntriesWithOptions:passingTest: – 2012-08-09 18:36:13

+0

好的,谢谢,这是有道理的。我试图理解'keysOfEnablingPassingTest',但这意味着理解块,这只是另一个复杂的层次。我对你对重新定义isEqual所说的话感兴趣。你是说如果我将属性不是作为数组存储,而是创建了一个“item”类,我可以用包含我当前拥有的数组的项目对象填充字典,并使用isEqual来做我想要做的比较?正如你所说,我想要的不是真正的“平等”情况。我只想用某个属性拉项目名称。 – 2012-08-09 18:51:27