我有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。最好的办法是什么?
答案 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;
}
注意:上面的代码未经测试,但至少足够接近,可以使您了解如何执行此操作。 :-)