AHGCollection 提供了基于函数式编程库(如 Scala Collections 和 Underscore.js)灵感的对象集合处理方法。
AHGCollection 与实现 NSFastEnumeration
协议的类一起工作。这包括以下 Foundation 类
它还应该适用于任何实现 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许可协议。