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

0 foreach cocoa objective-c 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]);
}
Run Code Online (Sandbox Code Playgroud)

调试器中的一些值:

   tree __NSCFArray *   0x6856cf0
   0    __NSCFString *  0x6818b70
   1    __NSCFString *  0x682be10
   2    __NSCFArray *   0x6856cd0
Run Code Online (Sandbox Code Playgroud)

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

然而步进一行:__ NSCFString*0x6818b70

繁荣,appcrash.

提示?

Jon*_*nah 6

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

这不是for (NSArray *a in tree)表达式的作用.该语句创建一个名为atype 的局部变量NSArray *,并将其指定为引用每个对象tree,而不管特定索引处的对象是否为NSArray.

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

NSArray *a;
for (NSInteger index = 0; index < [tree count]; index++) {
  a = [tree objectAtIndex:index];
  ...
}
Run Code Online (Sandbox Code Playgroud)

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


omz*_*omz 5

正如Jonah已经指出的那样,只是告诉编译器你期望NSArray它实际上并不是一个.如果要跳过循环中不是数组的对象,可以按如下方式执行:

for (NSArray *a in tree) {
    if (![a isKindOfClass:[NSArray class]]) continue;
    //...
}
Run Code Online (Sandbox Code Playgroud)