【发布时间】:2012-02-29 11:11:15
【问题描述】:
有没有人对未知结构的 NSDictionary 进行递归有序遍历?我想采用任何 NSDictionary 并按层次顺序处理每个级别。
1) 此数据来自经过验证的 JSON。是否可以肯定地说,从 SBJSON(JSON 框架)等框架创建的 NSDictionary 只会产生嵌套字典、数组和任意叶子的组合?
2) 如何使用适用于数组和字典的快速枚举来完成通用遍历?使用下面的代码,一旦我到达数组中的字典,它就会停止遍历。但是,如果我在数组条件中继续递归(以检查数组中的字典),它会在id value = [dict valueForKey:key]; 的下一次迭代中使用-[__NSCFDictionary length]: unrecognized selector sent to instance SIGABRT。我不知道为什么这会是个问题,因为我已经通过顶级字典(在其中找到子级字典数组)超过了那条线。
-(void)processParsedObject:(id)dict counter:(int)i parent:(NSString *)parent
{
for (id key in dict) {
id value = [dict valueForKey:key];
NSLog(@"%i : %@ : %@ -> %@", i, [value class], parent, key);
if ([value isKindOfClass:[NSDictionary class]])
{
i++;
NSDictionary* newDict = (NSDictionary*)value;
[self processParsedObject:newDict counter:i parent:(NSString*)key];
i--;
}
else if ([value isKindOfClass:[NSArray class]])
{
for (id obj in value) {
NSLog(@"Obj Type: %@", [obj class]);
}
}
}
}
非常感谢
【问题讨论】:
-
你每次 NSLog 一个 NSDictionary 时都这样做。
-
对,但总的来说,重点是在进程中捕获和处理嵌套的对象,而不仅仅是记录它们。
-
你只需要学习如何使用
isKindOfClass。
标签: iphone ios json cocoa-touch recursion