-
-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathNSArray+each.m
31 lines (27 loc) · 1.09 KB
/
NSArray+each.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#import "YOLO.ph"
@implementation NSArray (YOLOEach)
- (NSArray *(^)(id))each {
return ^(id frock) {
NSMethodSignature *sig = YOLOMS(frock);
void (^block)(id, NSUInteger) = ^{
switch (sig.numberOfArguments){
case 2: return ^(id a, NSUInteger b){ ((void(^)(id))frock)(a); };
case 3:
return [sig getArgumentTypeAtIndex:2][0] == '@'
? ^(id a, NSUInteger b){ ((void(^)(id, id))frock)(a, @(b)); }
: ^(id a, NSUInteger b){ ((void(^)(id, NSUInteger))frock)(a, b); };
case 4:
return [sig getArgumentTypeAtIndex:2][0] == '@'
? ^(id a, NSUInteger b){ ((void(^)(id, id, id))frock)(a, @(b), self); }
: ^(id a, NSUInteger b){ ((void(^)(id, NSUInteger, id))frock)(a, b, self); };
default:
@throw @"Invalid argument count to each";
}
}();
NSUInteger ii = 0;
for (id obj in self)
block(obj, ii++);
return self;
};
}
@end