2012-06-13 2 views
0

Я задал аналогичные вопросы, но все они заинтересованы в использовании блока для определенного значения массива. Это немного другое, я хочу заполнить значения массива при инициализации с помощью блока. Помимо подклассификации NSArray для этого существует другой способ, аналогичный этому: В этом сценарии я заполняю массив днями недели, где сегодня всегда посередине. Мой «классический» способ сделать это будет: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?

ответ

3

Вам не нужно подклассифицировать NSArray, чтобы добавить к нему метод. Будет категория.

Что вы хотите, невозможно с помощью любого из существующих методов NSArray. И это не будет работать так, как вы его разработали в своем вопросе, потому что язык не поддерживает множественные возвращаемые значения из блока (или функции или метода). Таким образом, вам придется написать блок, который фактически создает NSArray и возвращает это. Но если вы это сделаете, вы можете также оставить блок и создать массив сразу.

+2

Я предполагаю, что я ищу, это инициализатор, использующий блок, который ведет себя как генератор python for-yield. Но если это невозможно, то использование блоков просто усложнит несколько простой вопрос. Спасибо за ваш вклад! –

Смежные вопросы