Как и в Lvsti, я использую блоки для выполнения схемы переключения объектов.
Я написал очень простую цепочку, основанную на блоках фильтров, которая берет n блоков фильтров и выполняет каждый фильтр для объекта.
Каждый фильтр может изменить объект, но должен вернуть его. Неважно, что.
NSObject + Functional.h
#import <Foundation/Foundation.h>
typedef id(^FilterBlock)(id element, NSUInteger idx, BOOL *stop);
@interface NSObject (Functional)
-(id)processByPerformingFilterBlocks:(NSArray *)filterBlocks;
@end
NSObject + Functional.m
@implementation NSObject (Functional)
-(id)processByPerformingFilterBlocks:(NSArray *)filterBlocks
{
__block id blockSelf = self;
[filterBlocks enumerateObjectsUsingBlock:^( id (^block)(id,NSUInteger idx, BOOL*) , NSUInteger idx, BOOL *stop) {
blockSelf = block(blockSelf, idx, stop);
}];
return blockSelf;
}
@end
Теперь мы можем настроить n
FilterBlocks для проверки различных случаев.
FilterBlock caseYES = ^id(id element, NSUInteger idx, BOOL *breakAfter){
if ([element isEqualToString:@"YES"]) {
NSLog(@"You did it");
*breakAfter = YES;
}
return element;
};
FilterBlock caseNO = ^id(id element, NSUInteger idx, BOOL *breakAfter){
if ([element isEqualToString:@"NO"] ) {
NSLog(@"Nope");
*breakAfter = YES;
}
return element;
};
Теперь мы вставляем блок, который мы хотим проверить, в цепочку фильтров в массиве:
NSArray *filters = @[caseYES, caseNO];
и может выполнить его на объекте
id obj1 = @"YES";
id obj2 = @"NO";
[obj1 processByPerformingFilterBlocks:filters];
[obj2 processByPerformingFilterBlocks:filters];
Этот подход может использоваться для переключения, но также и для любого (условного) приложения цепочки фильтров, так как блоки могут редактировать элемент и передавать его.