将plist加载到NSArray后,我正在尝试访问其嵌套数组。
NSArray *tree = [[NSArray alloc] initWithContentsOfFile:path];
for (NSArray *a in tree)
{
//Let's assume object at index 0 is always NSString
NSLog(@"Returning the string: %@ ", [a objectAtIndex:0]);
}
调试器中的一些值:
tree __NSCFArray * 0x6856cf0
0 __NSCFString * 0x6818b70
1 __NSCFString * 0x682be10
2 __NSCFArray * 0x6856cd0
所以我期待for语句跳过前两个NSStrings,然后用NSArray执行。
然而踩一行: a __NSCFString * 0x6818b70
繁荣,appcrash。
提示?
答案 0 :(得分:6)
所以我期待for语句跳过前两个NSStrings,然后用NSArray执行。
这不是for (NSArray *a in tree)
表达式的作用。该语句创建一个名为a
的{{1}}类型的局部变量,并指定它引用NSArray *
中的每个对象,而不管特定索引处的对象是否为NSArray。
您的快速枚举循环大致相当于:
tree
答案 1 :(得分:5)
正如Jonah已经指出的那样,只是告诉编译器你期望NSArray
实际上并不是一个。如果要跳过循环中不是数组的对象,可以按如下方式执行:
for (NSArray *a in tree) {
if (![a isKindOfClass:[NSArray class]]) continue;
//...
}
答案 2 :(得分:0)
作为omz& Jonah指出,您的for
循环也不会仅通过指定a
的类型来选择项目。这是另一个变体,它清楚地表明元素可能不是数组:
for (id element in tree)
{
// skip non-arrays
if (![element isKindOfClass:[NSArray class]]) continue;
NSArray *a = (NSArray *)element;
...
}