AHGCollection 0.2.0

AHGCollection 0.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2015年3月

未认领 维护。



AHGCollection 提供了基于函数式编程库(如 Scala CollectionsUnderscore.js)灵感的对象集合处理方法。

AHGCollection 与实现 NSFastEnumeration 协议的类一起工作。这包括以下 Foundation 类

  • NSArray
  • NSSet
  • NSOrderedSet
  • NSDictionary (遍历键)

它还应该适用于任何实现 NSFastEnumeration 的自定义实现。如果您需要帮助将协议添加到您自己的类中,可以查看 AHGEnumeration.m 以了解一些不同实现方式。感谢 Mark Dalrymple 的深入研究,请参阅 theNerdBlog

懒加载

也许 AHGCollection 与向 Foundation 集合添加 "map/filter/reduce" 方法的其他库之间的主要区别在于,AHGCollection 是使用 "懒加载" 实现的。这意味着操作的结果如 "map" 不会立即生成新的集合。例如,给定一个包含 10,000 个对象的 NSArray,[AHGCollection map:] 不会生成另一个包含 10,000 个对象的 NSArray。相反,它将映射函数应用于每次使用 NSFastEnumeration 迭代集合时。如果您不打算使用所有 10,000 个结果(例如,您只在一个 UITableView 中显示对象的子集),这将非常有用。它还消除了自定义 NSFastEnumeration 实现中需要可变选项或描述在转换值时使用哪种可变集合的机制的需求。

您可以使用 [AHGCollection allObjects] 获取包含集合中所有对象的完整 NSArray,并应用任何操作。下面的 "Map" 例子展示了这一点。

示例

过滤器

BOOL (^myFilter)(NSString *) = ^(NSString *str) {
    return (BOOL) (str.length > 3);
};  

AHGCollection *strings = AHGNewColl(@[@"hello", @"to", @"you", @"again"]);
for (NSString *string in [strings filter:myFilter]) {
    // string's length is larger than 3
}

映射

NSSet *stringSet = [NSSet setWithArray:@[@"What", @"is", @"going", @"on", @"here?"]];
NSArray *result2 = [[[AHGNewColl(stringSet) map:^id(NSString *str) {
    return [str uppercaseString];
}] map:^id(NSString *str) {
    return [str stringByAppendingString:@"!"];
}] allObjects];

// Produces @[@"WHAT!", @"IS!", @"GOING!", @"ON!", @"HERE?!"]

减少

AHGCollection *strings = AHGNewColl(@[@"hello", @"to", @"you", @"again"]);

NSString *result = [strings reduce:@"" withOperator:^id(NSString *resultObject, NSString *anObject) {
    return [resultObject stringByAppendingString:anObject];
}];

// Produces @"hellotoyouagain"

组合操作

可以在集合上的许多操作中链接在一起。结果直到集合被遍历或使用 [AHGCollection allObjects] 转换为 NSArray 时才会评估。

NSNumber *num = [[[AHGNewColl(@[@"hello", @"to", @"you", @"again"]) filterNot:^BOOL(NSString *str) {
    return [str isEqualToString:@"again"];
}] map:^id(NSString *str) {
    return [str stringByAppendingString:@"-mapped"];
}] reduce:@0 withOperator:^id(NSNumber *resultObject, NSString *str) {
    return [NSNumber numberWithInteger:[resultObject integerValue] + [str length]];
}];

// Number will be 31

许可

AGHCollection采用MIT许可协议