使用来自NSDictionary的特定值的密钥获取对象

时间:2016-12-09 14:47:08

标签: objective-c uitableview key nsdictionary

我有NSDictionary与对象。 NSDictionary由json组成(您可以在下面看到)。我需要使用id的名称填充我的表视图。 id可以重复。这意味着我可以有几个“名称”,其id等于0.我应该通过键获得字典中的某个值。这是我的NSDictionary:

    {
        name = "smth1";
        id = 0;
    },
        {
        name = "smth2";
        id = 1;
    },
        {
        name = "smth3";
        id = 2;
    },
        {
        name = "smth4";
        id = 2;
    },
   ...

例如,我想得到关键字“name”的值,其中id为2.然后我将得到name =“smth3”和name =“smth4”。通常,我试图用嵌套数据填充我的表视图组件。我怎样才能做到这一点?任何提示,想法。谢谢。

1 个答案:

答案 0 :(得分:1)

实际上你会显示一个字典数组,其中每个字典有2个键。

您可以使用NSArray函数indexOfObjectPassingTest。该代码可能看起来像这样(从NSArray开始):

int idToFind = 2;
NSArray *dictArray = @[@{@"name": @"smth1",
                         @"id": @(0)},

                       @{@"name": @"smth2",
                         @"id": @(1)},

                       @{@"name": @"smth3",
                         @"id": @(2)}
                       ];


NSUInteger dictIndex = 
  [dictArray indexOfObjectPassingTest: ^BOOL(
    NSDictionary *dict, 
    NSUInteger idx, 
    BOOL *stop) {
       return [dict[@"id"] intValue] == idToFind;
  }];
if (dictIndex != NSNotFound) {
  NSLog(@"Found id %d with name %@", idToFind, dictArray[dictIndex][@"name"]);
}

}

编辑:

如果您需要匹配所有项目,则需要使用NSArray方法indexesOfObjectsPassingTest。找到数组中匹配的所有项目。

该代码如下所示:

int idToFind = 2;
NSArray *dictArray = @[@{@"name": @"smth1",
                         @"id": @(0)},

                       @{@"name": @"Fred",
                         @"id": @(2)},

                       @{@"name": @"smth2",
                         @"id": @(1)},

                       @{@"name": @"smth3",
                         @"id": @(2)},
                       ];
NSIndexSet *dictIndexes;
dictIndexes = 
  [dictArray indexesOfObjectsPassingTest: ^BOOL(NSDictionary *dict,
    NSUInteger idx,
    BOOL *stop) 
  {
    return [dict[@"id"] intValue] == idToFind;
  }];
 if (dictIndexes.count == 0) {
   NSLog(@"No matches found");
 }
 [dictIndexes enumerateIndexesUsingBlock:^(NSUInteger index, 
   BOOL * _Nonnull stop) 
 {
  NSLog(@"Found id=%@ with name \"%@\" at index %lu", 
    dictArray[index][@"id"], 
    dictArray[index][@"name"], 
    index);
 }];

上述两种方法都使用了一种方法。该块包含您编写的代码,该代码返回与您所需搜索条件匹配的项目的BOOL。

使用块的搜索/排序方法非常灵活,因为您可以提供任何想要进行匹配/比较的代码。

indexOfObjectPassingTest方法搜索数组中的单个对象,并在找到第一个匹配项时停止。

相反,indexesOfObjectsPassingTest函数将匹配多个项目。它返回一个NSIndexSet,一个用于索引NSArrays的特殊类。

有一个函数enumerateIndexesUsingBlock,它为数组中指定的每个索引调用一段代码。

我们也可以使用方法objectsAtIndexes仅提取数组中结果索引集中列出的元素,然后使用for...in循环遍历项目。该代码看起来像这样:

NSArray *filteredArray = [dictArray objectsAtIndexes: dictIndexes];
for (NSDictionary *aDict in filteredArray) {
  NSLog(@"Found id=%@ with name \"%@\"", aDict[@"id"], aDict[@"name"]);
}

请注意,这种事情在Swift中更简单,更清晰。我们可以在数组上使用filter语句,并提供一个闭包,用于选择符合我们搜索条件的项目