Ios Objective-C从关键NSDictionary和NSArray中获取值

Ios Objective-C从关键NSDictionary和NSArray中获取值,ios,objective-c,Ios,Objective C,我有一个名为productionSchedule的NSDictionary,里面是1个键/值对,其中的键称为KeyValue,KayValue的值是31个元素,在2个键/值对NSDictionary中的每个元素中,有一个键和值。我试图做的是获取键的值(这是一个NSDictionary),例如FA50100。这是productionSchedule的屏幕截图 以下是我尝试过的项目 NSDictionary *productionDictionary = [[productionSchedule

我有一个名为productionSchedule的NSDictionary,里面是1个键/值对,其中的键称为KeyValue,KayValue的值是31个元素,在2个键/值对NSDictionary中的每个元素中,有一个键和值。我试图做的是获取键的值(这是一个NSDictionary),例如FA50100。这是productionSchedule的屏幕截图

以下是我尝试过的项目

NSDictionary *productionDictionary = [[productionSchedule valueForKey:@"KeyValue"] valueForKey:[prodSchedSortedKeys objectAtIndex:0]];
如何根据某个键获取值

这给了我所有的价值观:

NSLog(@"%@", [[productionSchedule objectForKey:@"KeyValue"] valueForKey:@"Value"]);
我想我只是在KeyValue和Value之间遗漏了一些东西

当我尝试这个:

NSLog(@"%@", [[[productionSchedule objectForKey:@"KeyValue"] valueForKey:@"FA50100"] valueForKey:@"Value"]);
我得到31个空值:(

A.读取转储

由于LLDB,转储有点混乱。让我们看看它

这就是你得到的:

productionSchedule (dictionary with 1 kvp)
  [0] @"KeyValue" : 31 elements
    key = @"KeyValue"
    value = array of 31 elements
  …
什么?索引为0的字典?!这是因为字典在内部表示为成对键和值的列表。因此,这只是列表的第一对。让我们更严格地编写它,忘记它下面的键=和值=:

productionSchedule (dictionary with 1 kvp)
  @"KeyValue" : array with 31 Elements
  …
所以

productionSchedule[@"KeyValue"] // evals to an array
你得到了一个包含31个元素的数组。你必须通过索引访问这个数组。比如说,你想得到这个数组的第一个元素。(因为你没有识别这个层的数组,你没有说,你想要什么元素。也许你想搜索数组。让我知道)

此数组的第一个元素是字典

productionSchedule[@"KeyValue"][0] // evals to a dictionary
它有两个kvp。同样,忘记索引。它是一个字典:

productionSchedule (dictionary with 1 kvp)
  @"KeyValue" : 31 elements
    [0] dictionary with 2 kvp
      @"Key" : @"FA50100"
  …
@"FA50100" : dictionary with 6 kvp.
因此,要获得
@“FA50100”
,您必须执行以下操作

productionSchedule[@"KeyValue"][0][@"Key"] // evals to a dictionary
B.结构

让我这样说:整个结构似乎已经损坏。你是如何创建它的?在没有完整信息的情况下,我会给你一些建议:

a) 拥有一个kvp和一个毫无意义的键@“KeyValue”的字典是完全没有意义的。首先我们必须扔掉它,从阵列开始

b) 在这个数组中有31个元素。我想这是真正的清单。但这是用一个2 kvp的字典建模的。(我假设这个结构也适用于31个元素的其余部分。)字典是这样的

@“密钥”:@“FA50100” @“值”:具有6 kvp的字典

c) 因此,您在保存kvp的集合中创建了一个kvp。这样做有什么意义

显然,
@“FA50100”
类似于一个id,被称为
@“value”
的值就是这个键的数据。因此,只需将阵列和stor ID及其数据丢弃在一个字典中即可:

productionSchedule (dictionary with 1 kvp)
  @"KeyValue" : 31 elements
    [0] dictionary with 2 kvp
      @"Key" : @"FA50100"
  …
@"FA50100" : dictionary with 6 kvp.
然后,您可以通过以下方式访问
@“FA50100”
的值

NSDictionary *collection = …
collection[@"FA50100"] // gets the dictionary for FA50100
d) 如果不可能使用c,因为id“FA50100”在列表中可能出现多次,请使用数组返回,并将id与6 kvp一起放入字典

但绝对不要在字典中使用像@“Key”或@“Value”这样的键

C.用于调试


然而,这里有一个提示,如果您在递归集合中迷失了方向:从一步一步地阅读它,并在每一步上做一个日志来获取类

你所说的某个键是什么意思?我的意思是如何从“键”中获取“值”@“键”@“键”@“你的键”[@“你的键”]因此
productionSchedule[@“你的键”]
Nope不起作用,它会返回null好的,因此我可以通过……
productionSchedule[@“键值”][0][@“键”]
但我不知道如何通过
NSDictionary*collection=…collection[@“FA50100”]
获取数据。我无法更改来自外部源的数据。如果您无法更改数据结构,您可以得到,您有两个选项:1。将数据转换为更方便的结构(当您获得它或2时)。使用
[@“KeyValue”][0][@“Key”]
。就我个人而言,我更喜欢第一种选择。