访问数组的内容Objective C

时间:2013-02-11 18:17:29

标签: objective-c json

我有这样的json结构 我正在尝试检查"类型"在每个嵌套的小部件数组中。如果它是某种类型,那么我试图提取像淡入淡出步骤,宽度,高度等属性。

有没有办法使用for循环? 现在我这样做:

for (NSString *widgetArray in widgets)
{
    NSLog(@"%@", widgetArray);
}

其打印内容,如何提取相应的值?     for(NSDictionary * [assets allValues]中的资产)     {         NSString * type = asset [@" type"];

    if ([type isEqualToString:@"gradient"])
    {
        [gradients addObject:asset];

    }

这是帮助我访问字典内容的其中一个成员提供的伪代码,我无法对嵌套数组结构应用类似的逻辑。

3 个答案:

答案 0 :(得分:0)

要检查每个元素的类型,请使用NSObject isKindOfClass:方法。

所以,你可能有类似的东西:

if ([obj isKindOfClass:[NSDictionary class]]) { ... }

或者

if ([obj isKindOfClass:[NSArray class]]) { ... }

就像@ H2CO3所说,你使用objectAtIndex:来访问数组元素,使用objectForKey:来访问字典元素。

编辑:我刚刚意识到,通过“某种类型”,OP意味着“类型”字段的值,而不是条目的objective-c类。但是,在读取JSON数据以确定条目是数组还是字典时,它通常很有用,所以我将在这里留下我的答案。

答案 1 :(得分:0)

在最新的目标C中,您可以使用类似C数组的下标。例如,

NSLog(@"%@", widgetArray[i]);

对于词典,您可以通过键提取:

NSString* id = myDict[@"id"];

答案 2 :(得分:0)

由于问题是递归搜索,您必须使用堆栈。以下是步骤:

  1. 创建将用作堆栈的NSMutableArray。现在它是空的。
  2. 获取根widgets数组并将其所有对象放入堆栈(-addObjectsFromArray:)。
  3. 取出堆栈中的第一个小部件(NSDictionary)。在将其存储在变量中之后,请确保将从堆栈-removeObjectAtIndex:中删除。
  4. 使用该变量进行type比较和其他内容。
  5. 将其子小部件放入堆栈,就像步骤2中 一样。
  6. 如果堆栈中有内容,请从步骤3 重复。否则你处理了所有小部件。
  7. 伪代码:

    // 1
    NSMutableArray *stack = [NSMutableArray array];
    // 2
    [stack addObjectsFromArray:rootWidgets];
    while (stack.count > 0) {
        // 3
        NSDictionary *widgetDict = [stack objectAtIndex:0];
        [stack removeObjectAtIndex:0];
        // 4
        if ([[widgetDict objectForKey:@"type"] isEqualToString:...]) // Do whatever...
        // 5
        [stack addObjectsFromArray:[widgetDict objectForKey:@"widgets"]];
    }
    // 6
    // You are done...