0.3.0

Bite 0.3.0

测试测试过
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2015 年 1 月

Brian NickelBrian Nickel 维护。



Bite 0.3.0

  • Brian Nickel

bite-objc

Bite 是一个基于 NSFastEnumeration 的函数式枚举库,提供像 take:filter:map: 这样的函数。虽然许多 Foundation 集合已经提供了类似操作,但 Bite 允许你在不引入大或可变中间变量的情况下进行这些操作。

概念基于 Bite Java 库

用法

安装

pod 'Bite', '~> 0.2'
#import <Bite/Bite.h>

创建一个 bite

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.
}

创建一个递归 bite

BITEEnumerator *bite = BITE_INTO(self, @selector(parentViewController));

for (id viewController in bite) {
    if ([viewController isKindOfClass:[MyViewController class]]) {
        return viewController;
    }
}

递归 bite 会迭代,直到它们遇到一个 nil 值。

链式使用 bite

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 *)keyPathmap: 相同,但选择每个元素中的键路径。

  • - (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]);

示例

  1. 使用块和元组从对象创建字典。

    NSDictionary *networkUsersForSites = [[[BITE(networkUsers) filter:^BOOL(StacManNetworkUser *user) {
        return user.siteUrl != nil;
    }] map:^id(StacManNetworkUser *user) {
        return PAIR(user.siteUrl, user);
    }] dictionaryWithPairs];
  2. 使用谓词和路径创建相同的内容。

    NSDictionary *networkUsersForSites = [[BITE(networkUsers) filterWithFormat:@"siteUrl != nil"]
                                                             dictionaryWithKeyPath:@"siteUrl" valuePath:@"self"];
  3. 找到单元格的父母表视图。

    UITableView *tableView = [[BITE_INTO(cell, @selector(superview))
                               filterWithFormat:@"self isKindOfClass: %@", [UITableView class]]
                              first:NULL];