NSArray动态初始化并填充块

时间:2012-06-13 12:29:27

标签: objective-c nsarray objective-c-blocks

我问过类似的问题,但他们都关注使用一个块来获取数组的特定值。这有点不同,我想在初始化时使用块填充数组的值。除了子类化NSArray之外,还有另外一种方法: 在这种情况下,我用一周中的几天填充一个数组,今天总是在中间。我的“经典”方式是:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
[dateFormatter setDateFormat:@"EEEE"];   
NSMutableArray *test = [[NSMutableArray alloc] init];
for (int i = -3; i < 4; i++) {
    [test addObject:[dateFormatter stringFromDate:[[NSDate date] dateByAddingTimeInterval:60*60*24*i]]];
}

理想情况下,我想做的是初始化一个数组并用一个动态分配的值填充它,如下所示:

NSArray *array = [[NSArray alloc] initWithObjects:^(){  for (int i = -3; i < 4; i++) {
    return [dateFormatter stringFromDate:[[NSDate date] dateByAddingTimeInterval:60*60*24*i]];
}}, nil];

现在上面的代码没有创建任何东西,并且正确如此,因为方法initWithObjects期望对象而不是块,此外,块将执行一次,只返回一个对象。那么这是可行/可行的,还是我需要继承NSArray来创建类似initWithBlock的方法?

1 个答案:

答案 0 :(得分:3)

您不需要将NSArray子类化为其添加方法。一个类别就可以了。

使用任何当前的NSArray方法都无法实现您的目标。当你在问题中起草它时它不会很有效,因为语言不支持块(或函数或方法)的多个返回值。因此,您必须编写一个实际创建NSArray的块并返回该块。但是如果你这样做,你也可以省去块并立即创建阵列。