NSArray的对象“可能”为零

时间:2014-06-12 02:19:28

标签: ios objective-c nsmutablearray nsarray

我有3个可能以随机顺序初始化的对象。

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

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

这个怎么样:

创建一个空的可变数组。

在3个单独的陈述中:

如果objectOne不是nil,请将其添加到数组

如果objectTwo不是nil,则将其添加到数组

如果objectThree不是nil,请将其添加到数组中。

如果你需要你的对象是随机顺序,那么在几个字后加扰数组:

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

这被称为Fisher-Yates shuffle。 (或者反过来对Fisher-Yates的一个小变化。)

答案 2 :(得分:0)

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

如果您经常这样做,并且希望使用与数组文字符号类似的语法,则可以利用C预处理程序和C数组来创建一个处理nil的更智能的NSArray类构造函数:

#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;
}

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