【问题标题】:ObjC: NSDictionary allKeysForObject *containing* (is this possible?)ObjC:NSDictionary allKeysForObject *包含*(这可能吗?)
【发布时间】:2012-08-09 18:13:56
【问题描述】:

我对 Objective-C 非常陌生,遇到了 NSDictionary 方法allKeysForObject:。似乎非常有用。但是,我有一个 NSDictionary,它有几个 NSArrays(长度均为 2),并且由 NSStrings 键入。基本上,键是项,数组定义了它们的两个属性。如果我想提取所有具有特定属性的项目名称,可以使用 allKeysForObject 之类的东西来完成,还是应该只循环字典并增长一个可变数组(似乎效率低下)。

我会包含一个代码 sn-p,但我觉得这个问题足够概念化,代码不会真正澄清任何事情。哦,什么鬼。下面是一些简化的代码:

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"。我感觉这不是这种方法的设计目的。

【问题讨论】:

    标签: objective-c nsdictionary


    【解决方案1】:

    您正在寻找-keysOfEntriesPassingTest:...

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

    【讨论】:

    • 啊哈!这看起来不错!谢谢,我需要玩它,但感谢您为我指明正确的轨道!
    【解决方案2】:

    在你的例子中,如果你打电话

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

    你应该得到一个只包含@"Boat"的数组

    【讨论】:

    • 谢谢,我知道这会怎样。是否也可以只匹配其中一个元素?基本上,例如,我想匹配包含 NSNumber 2 的一类对象。理想情况下,这种匹配将与位置无关,因此它将匹配数组中任何位置的 NSNumber 2。
    • 没有。 allKeysForObject 应该返回映射到同一对象的所有键(在 isEqual 的意义上,而不是在具有相同地址的意义上)。如果你想做你所说的,你需要存储一些不同于 NSArray 的东西。创建自己的类并根据需要定义 isEqual 。或者使用 keysOfEntriesPassingTest: 或 keysOfEntriesWithOptions:passingTest:
    • 好的,谢谢,有道理。我试图理解keysOfEnteriesPassingTest,但这意味着理解块,这只是另一个复杂程度。我对你所说的重新定义 isEqual 很感兴趣。你是说如果我不将属性存储为数组,而是创建了一个“项目”类,我可以用包含我当前拥有的数组的项目对象填充字典并使用 isEqual 来进行我想做的比较?不过,正如你所说,我想要的并不是真正的“平等”情况。我只想提取具有特定属性的项目名称。
    • allKeysForObject 假设您对相等情况感兴趣。当然,如果你定义一个类,它的两个实例相等意味着什么完全取决于你:只需相应地实现 isEqual 即可。我确实知道积木是要学习的其他东西。但这是目前做我认为你想做的事情的最佳做法。
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多