for(目录中的NSArray * a)无法正常工作

时间:2012-01-21 09:19:07

标签: objective-c cocoa foreach nsarray

将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。

提示?

3 个答案:

答案 0 :(得分:6)

  

所以我期待for语句跳过前两个NSStrings,然后用NSArray执行。

这不是for (NSArray *a in tree)表达式的作用。该语句创建一个名为a的{​​{1}}类型的局部变量,并指定它引用NSArray *中的每个对象,而不管特定索引处的对象是否为NSArray。

您的快速枚举循环大致相当于:

tree

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocFastEnumeration.html

答案 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;
   ...
}