Применить блок ко всем объектам NSArray - PullRequest
2 голосов
/ 04 марта 2011

Есть ли способ применить блок ко всем объектам массива?

Допустим, у меня есть удивительный блок:

void (^myAmazingBlock)(NSNumber *) = ^(NSNumber *aFooNumber) {
    NSLog(@"Log message from an Amazing Block: %@", aFooNumber);
};

Чтобы применить мой блок ко всем объектам моего массива, это работает:

for (NSNumber *aNumber in myArray) {
    myAmazingBlock(aNumber);
}

Можно ли избавиться от быстрого цикла перечисления и получить нечто похожее по духу на:

[myArray valueForKeyPath:@"@distinctUnionOfObjects.^myAmazingBlock"]; // This code doesn't work. It's just to show the style of what I'm trying to write.

У меня нет особого смысла; Мне просто было любопытно узнать о других возможных способах написать это.


Edit:

Можно использовать enumerateObjectsUsingBlock: (Спасибо, paulbailey).
Затем вы должны объявить свой блок следующим образом:

void (^myAmazingBlock2)(id, NSUInteger, BOOL *) = ^(id aFooNumber, NSUInteger idx, BOOL *stop) {
    NSLog(@"Amazing BLOCK 2 %@", aFooNumber);
};

[myArray enumerateObjectsUsingBlock:myAmazingBlock2];

К сожалению, быстрый цикл перечисления остается наиболее читаемым решением.

1 Ответ

2 голосов
/ 04 марта 2011

Вы могли бы использовать enumerateObjectsUsingBlock: возможно?Очевидно, вам придется адаптировать параметры вашего блока в соответствии с указанными.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

...