【问题标题】:for (NSArray *a in directory) doesn't work as I would expectfor (NSArray *a in directory) 不像我预期的那样工作
【发布时间】:2012-01-22 08:48:33
【问题描述】:

将 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 语句跳过前 2 个 NSString,然后使用 NSArray 执行。

但是一步一步: 一个 __NSCFString * 0x6818b70

然后繁荣,appcrash。

提示?

【问题讨论】:

  • 指定您收到的确切错误消息(可能是未捕获的异常)会有所帮助。

标签: objective-c cocoa foreach nsarray


【解决方案1】:

所以我希望 for 语句跳过前 2 个 NSString,然后使用 NSArray 执行。

这不是for (NSArray *a in tree) 表达式的作用。该语句创建了一个名为a 类型为NSArray * 的局部变量,并将其分配给tree 中的每个对象,无论特定索引处的对象是否为NSArray。

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

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

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

【讨论】:

    【解决方案2】:

    正如 Jonah 已经指出的那样,仅仅告诉编译器您期望 NSArray 并不能真正实现它。如果你想跳过循环中不是数组的对象,你可以这样做:

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

    【讨论】:

      【解决方案3】:

      正如 omz 和 Jonah 指出的那样,您的 for 循环也不会仅通过指定 a 的类型来选择项目。这是另一个变体,它清楚地表明元素可能不是数组:

      for (id element in tree)
      {
         // skip non-arrays
         if (![element isKindOfClass:[NSArray class]]) continue;
      
         NSArray *a = (NSArray *)element;
         ...
      }
      

      【讨论】:

      • 这和omz的一样。为什么还要再发一次?
      • @ChristianBeer - omz 将元素提取到NSArray * 类型的变量中,然后检查这是否有效;上面的代码将元素提取到id 类型的变量中,这是有效的,并且只有当它是一个数组时,它才会分配给NSArray * 类型的变量。特别是考虑到这个问题涉及对类型的混淆,小心处理它们似乎是明智和清晰的;为什么要给 NSArray * 分配一些东西,因为他很清楚它可能不是那种类型?
      猜你喜欢
      • 2012-06-13
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2014-05-16
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多