【问题标题】:NSArray with objects that "might" be nil带有“可能”为 nil 的对象的 NSArray
【发布时间】:2014-06-12 02:19:27
【问题描述】:

我有 3 个对象可能按随机顺序初始化或未初始化。

所以,如果对象“objectOne”、“objectTwo”、“objectThree”按此顺序初始化

myArray  = [NSArray arrayWithObjects:objectOne,objectTwo,objectThree nil];

所有对象都可以毫无问题地进入数组,但在我的情况下,objectOne、objectTwo 可能是 nil,而 objectThree 可能不是 nil,在这种情况下,我希望 myArray 返回(计数)1。

如果 objectOne 为 nil 但 objectTwo 和 objectThree 不为零,我希望我的数组返回(计数)2。

在最后两种情况下,我的数组总是返回 nil。最好的方法是什么?

【问题讨论】:

    标签: ios objective-c nsmutablearray nsarray


    【解决方案1】:

    没有神奇的方法可以为你解决问题,你需要从NSMutableArray构建数组

    NSMutableArray *array = [NSMutableArray array];
    if (objectOne) [array addObject:objectOne];
    if (objectTwo) [array addObject:objectTwo];
    if (objectThree) [array addObject:objectThree];
    

    【讨论】:

    • +1。此外,这可以通过NSMutableArray 上的类别进行一些清理。
    【解决方案2】:

    数组不能包含 nil。有一个特殊的对象,NSNull ([NSNull null]),用作 nil 的占位符。您可以将 NSNull 放入一个数组中,但我认为这也不能解决您的问题。

    这个怎么样:

    创建一个空的可变数组。

    在 3 个单独的语句中:

    如果 objectOne 不为零,则将其添加到数组中

    如果 objectTwo 不为零,则将其添加到数组中

    如果 objectThree 不为零,则将其添加到数组中。

    如果您需要您的对象以随机顺序排列,请在后面加扰数组:

    for (int index = 0; index < array.count; index++)
    { 
      int randomIndex = arc4random_uniform()
      [array exchangeObjectAtIndex: index withObjectAtIndex: randomIndex];
    }
    

    这被称为 Fisher-Yates 洗牌。 (或者,无论如何,Fisher-Yates 的一个小变化。)

    【讨论】:

      【解决方案3】:

      如果您很少这样做并且不想让事情变得整洁,那么您当然可以使用可变数组并在代码中一次添加或不添加项目,具体取决于是否为 nil。

      如果你经常这样做并且你想要一个看起来类似于数组文字表示法的语法,你可以利用 C 预处理器和 C 数组来创建一个更智能的 NSArray 类构造函数来处理 nil:

      #define NSArrayWithCArray(array) \
          [NSArray arrayWithCArray:cArray count:sizeof(cArray) / sizeof(cArray[0])];
      
      id cArray[] = {
          object1,
          object2,
          object3,
          ...
      };
      NSArray *array = NSArrayWithCArray(cArray);
      

      然后在 NSObject 上定义一个以编程方式遍历 C 数组的方法,删除任何 nil 值。

      + (NSArray *)arrayWithCArray:(__strong id[])cArray count:(NSUInteger)count {
        NSMutableArray *array = [NSMutableArray arrayWithCapacity:count];
        for (__strong id *item = cArray; item < cArray + count; item++) {
          if (*item != nil) {
            [array addObject:*item];
          }
        }
        return array;
      }
      

      注意:上面的代码未经测试,但至少足够接近让您了解如何执行此操作。 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 2014-11-20
        • 2013-06-06
        • 1970-01-01
        相关资源
        最近更新 更多