Мое решение на основе блоков может выглядеть несколько излишним, но если у вас есть несколько из этих требований, это может быть полезно:
создать категорию на NSArray:
@interface NSArray (FunctionalTools)
- (NSArray *)arrayByPerformingBlock:(id (^)(id element))performBlock;
@end
@implementation NSArray (FunctionalTools)
- (NSArray *)arrayByPerformingBlock:(id (^)(id element))performBlock
{
NSMutableArray *array = [NSMutableArray array];
for (id element in self){
[array addObject:performBlock(element)];
}
return array;
}
@end
ииспользуйте это так:
#import "NSArray+FunctionalTools.h"
//....
self.youtubeVideos = [NSArray arrayWithObjects:
@"http://example.com/index.php?number=1&keyword=",
@"http://example.com/index.php?number=2&keyword=",
nil];
self.youtubeVideos = [youtubeVideos arrayByPerformingBlock:^id(id element) { return [element stringByAppendingString:@"KeyWord"];}];
NSLog(@"%@", youtubeVideos);
или даже
self.youtubeVideos = [[NSArray arrayWithObjects:
@"http://example.com/index.php?number=1&keyword=",
@"http://example.com/index.php?number=2&keyword=",
nil] arrayByPerformingBlock:^id(id element) { return [element stringByAppendingString:@"KeyWord"];}];
Я включил этот пример в пример проекта , который я написал, чтобы научить себя основываться на блокахметоды использования функционального стиля программирования с Objective-C.Исходя из Python, я всегда скучал по списку, как
l = ['aa', 'ab','c','ad','dd']
l = [i+i for i in l if i.startswith('a')]
На основе блоков это выглядит так:
NSArray *array = [NSArray arrayWithObjects:@"aa", @"ab",@"c",@"ad",@"dd", nil];
array = [array arrayByPerformingBlock:^id(id element) { return [element stringByAppendingString:element]; }
ifElementPassesTest:^BOOL(id element) {return [element hasPrefix:@"a"];}];