Bite 是一个基于 NSFastEnumeration
的函数式枚举库,提供像 take:
、filter:
和 map:
这样的函数。虽然许多 Foundation 集合已经提供了类似操作,但 Bite 允许你在不引入大或可变中间变量的情况下进行这些操作。
概念基于 Bite Java 库。
pod 'Bite', '~> 0.2'
#import <Bite/Bite.h>
BITEEnumerator *bite = BITE(myArray);
BITEEnumerator *bite2 = BITE(myArray, 2); // Never enumerate over more than two elements at a time.
for (id obj in BITE(myArray)) {
// Use directly in a for-in block.
}
BITEEnumerator *bite = BITE_INTO(self, @selector(parentViewController));
for (id viewController in bite) {
if ([viewController isKindOfClass:[MyViewController class]]) {
return viewController;
}
}
递归 bite 会迭代,直到它们遇到一个 nil
值。
BITEEnumerator *bite = [BITE(myArray) filter^BOOL(id obj) { return [obj size].width < 100; }];
BITEEnumerator *bite2 = [bite skip:5];
for (id obj in [bite2 take:5]) {
[self doSomething:obj];
}
- (BITEEnumerator *)take:(NSUInteger)count
在迭代 count
个元素后停止。- (BITEEnumerator *)skip:(NSUInteger)count
跳过 count
个元素。
- (BITEEnumerator *)map:(id (^)(id obj))mappingFunction
有 NSExpression 版本。通过映射函数传递每个元素并迭代结果。
- (BITEEnumerator *)mapWithKeyPath:(NSString *)keyPath
与 map:
相同,但选择每个元素中的键路径。
- (BITEEnumerator *)filter:(BOOL (^)(id obj))test
有 NSPredicate 版本。只迭代通过测试的元素。用于在生成集合之前进行 nil
过滤。
- (BITEEnumerator *)choke:(NSUInteger)choke
降低加载到快速枚举缓冲区中的元素数量。- (BITEEnumerator *)except:(id)obj
过滤掉与给定对象相等的元素。- (BITEEnumerator *)until:(BOOL (^)(id obj))test
有 NSPredicate 版本。在测试通过时停止迭代。- (BITEEnumerator *)and:(id<NSFastEnumeration>)enumerator
将此枚举器与另一个枚举器连接起来。- (BITEEnumerator *)andObject:(id)obj
将此枚举器与单个元素连接起来。- (NSUInteger)count
返回枚举器中的元素数量。- (NSArray *)array
创建一个数组。- (NSSet *)set
创建一个集合。- (NSDictionary *)dictionaryWithKeyPath:(NSString *)keyPath valuePath:(NSString *)valuePath
使用路径作为键和值的字典。- (NSDictionary *)dictionaryWithPairs
使用路径 _1
作为键,_2
作为值创建字典。与 PAIR/BITE_TUPLE
一起使用。- (NSString *)joinedByString:(NSString *)separator
使用分隔符连接枚举器中的元素。
- (BOOL)any:(BOOL (^)(id obj))test
具有 NSPredicate 版本。 如果枚举器中的任何项目通过测试,则返回 YES
并停止迭代。限制执行以缓冲区一个元素。
- (BOOL)all:(BOOL (^)(id obj))test
具有 NSPredicate 版本。 如果枚举器中的所有项目通过测试,则返回 YES
。测试失败则返回 NO
并停止迭代。限制执行以缓冲区一个元素。
- (id)first:(out BOOL *)exists
返回第一个项或返回 nil
如果枚举器为空。可选地输出是否返回项到 exists
,在 nil
是有效枚举项的情况下。
- (id)last:(out BOOL *)exists
返回最后一个项或返回 nil
如果枚举器为空。可选地输出是否返回项到 exists
,在 nil
是有效枚举项的情况下。
- (id)foldLeft:(id)initial func:(id (^)(id acc, id obj))func
使用初始累加器值向左折叠。
- (id)foldRight:(id)initial func:(id (^)(id obj, id acc))func
使用初始累加器值向右折叠。
- (id)reduceLeft:(id (^)(id acc, id obj))func
向左递减。
- (id)reduceRight:(id (^)(id obj, id acc))func
向右递减。BITETuple
包含索引属性 _1
、_2
、_3
,可以使用重载的 BITE_TUPLE
函数创建。如果定义了 BITE_SHORTHAND
后再导入 bite,存在简写宏。
id a = BITE_TUPLE(@1);
id b = BITE_TUPLE(@1, @2);
id c = BITE_TUPLE(@1, @2, @3);
// or
id d = MONAD(@1);
id e = PAIR(@1, @2);
id f = TREBLE(@1, @2, @3);
NSParameterAssert([e _2] == [f _2]);
使用块和元组从对象创建字典。
NSDictionary *networkUsersForSites = [[[BITE(networkUsers) filter:^BOOL(StacManNetworkUser *user) {
return user.siteUrl != nil;
}] map:^id(StacManNetworkUser *user) {
return PAIR(user.siteUrl, user);
}] dictionaryWithPairs];
使用谓词和路径创建相同的内容。
NSDictionary *networkUsersForSites = [[BITE(networkUsers) filterWithFormat:@"siteUrl != nil"]
dictionaryWithKeyPath:@"siteUrl" valuePath:@"self"];
找到单元格的父母表视图。
UITableView *tableView = [[BITE_INTO(cell, @selector(superview))
filterWithFormat:@"self isKindOfClass: %@", [UITableView class]]
first:NULL];