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];