Functional.m 是 Objective-C 的一个扩展,可以用来进行函数式编程。
以下是各个函数的文档
numberArray NSArray 包含了一组 NSNumbers,dict NSDictionary 包含相同的集合 - 键是数字的名称
NSArray *numberArray = [NSArray arrayFrom:1 To:5];
NSArray *numberNamesArray = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", @"five", nil];
NSDictionary *numberDict = [NSDictionary dictionaryWithObjects:numberArray forKeys:numberNamesArray];
给定的迭代器对集合中的每个对象运行。
- (void) each:(VoidIteratorArrayBlock) block;
- (void) each:(VoidIteratorDictBlock) block;
示例
[numberArray each:^(id obj) {
NSLog(@"Current Object : %@", obj);
}];
[numberDict each:^(id key, id value) {
NSLog(@"%@ => %@", key, value);
}];
集合中的每个对象都可以在迭代器中转换。
- (NSArray *) map:(MapArrayBlock) block;
- (NSDictionary *) map:(MapDictBlock) block;
示例
NSArray *doubleArray = [numberArray map:^NSNumber*(NSNumber *obj) {
return [NSNumber numberWithInt:([obj intValue]*2)];
}];
NSDictionary *doubleDict = [numberDict map:^NSNumber*(id key, NSNumber *obj) {
return [NSNumber numberWithInt:([obj intValue]*2)];
}];
NSLog(@"Double : Array %@ - Dict %@", doubleArray, doubleDict);
将集合中的所有对象归约成一个值(例如计算平均值等)
- (id) reduce:(ReduceArrayBlock) block withInitialMemo:(id) memo;
- (id) reduce:(ReduceDictBlock) block withInitialMemo:(id) memo;
示例 - 将数组或字典中的所有 NSNumbers 相加。
NSNumber *memo = [NSNumber numberWithInt:0];
NSNumber *sumArray = [numberArray reduce:^NSNumber*(NSNumber *memo, NSNumber *cur) {
return [NSNumber numberWithInt:([memo intValue] + [cur intValue])];
} withInitialMemo:memo];
NSNumber *sumDict = [numberDict reduce:^NSNumber*(NSNumber *memo, id key, NSNumber *cur) {
return [NSNumber numberWithInt:([memo intValue] + [cur intValue])];
} withInitialMemo:memo];
NSLog(@"Sum : Array %@ - Dict %@", sumArray, sumDict);
Filter
提供了迭代器返回 true 的那些对象。 Reject
移除了迭代器返回 true 的所有对象。
- (NSArray *) filter:(BoolArrayBlock) block;
- (NSArray *) reject:(BoolArrayBlock) block;
- (NSDictionary*) filter:(BoolDictionaryBlock) block;
- (NSDictionary*) reject:(BoolDictionaryBlock) block;
此示例为您提供了数组或字典中的所有偶数(filter)或奇数(reject)。
BoolArrayBlock isEvenArrayBlock = ^BOOL(NSNumber *obj) {
return (([obj intValue] % 2) == 0);
};
BoolDictionaryBlock isEvenDictBlock = ^BOOL(id key, NSNumber *obj) {
return (([obj intValue] % 2) == 0);
};
NSArray *evenArr = [numberArray filter:isEvenArrayBlock];
NSDictionary *evenDict = [numberDict filter:isEvenDictBlock];
NSLog(@"The following elements are even : Array %@ - Dict %@", evenArr, evenDict);
#pragma mark - reject
NSArray *oddArr = [numberArray reject:isEvenArrayBlock];
NSDictionary *oddDict = [numberDict reject:isEvenDictBlock];
NSLog(@"The following elements are odd : Array %@ - Dict %@", oddArr, oddDict);
isValidForAll
如果迭代器对集合中的所有元素都返回 YES,则返回 YES。 isValidForAny
如果迭代器对集合中至少一个对象返回 YES,则返回 YES。
- (BOOL) isValidForAll:(BoolArrayBlock) block;
- (BOOL) isValidForAny:(BoolArrayBlock) block;
- (BOOL) isValidForAll:(BoolDictionaryBlock) block;
- (BOOL) isValidForAny:(BoolDictionaryBlock) block;
此示例检查集合中的所有或任何元素是否都是偶数。
BoolArrayBlock isEvenArrayBlock = ^BOOL(NSNumber *obj) {
return (([obj intValue] % 2) == 0);
};
BoolDictionaryBlock isEvenDictBlock = ^BOOL(id key, NSNumber *obj) {
return (([obj intValue] % 2) == 0);
};
NSLog(@"Only even numbers : Array %d - Dict %d", [numberArray isValidForAll:isEvenArrayBlock], [numberDict isValidForAll:isEvenDictBlock]);
# pragma mark - isValidForAny
NSLog(@"Any even numbers : Array %d - Dict %d", [numberArray isValidForAny:isEvenArrayBlock], [numberDict isValidForAny:isEvenDictBlock]);
计算集合中返回 true 的项的数量
- (NSNumber *) countValidEntries:(BoolArrayBlock) block;
- (NSNumber *) countValidEntries:(BoolDictionaryBlock) block;
BoolArrayBlock isEvenArrayBlock = ^BOOL(NSNumber *obj) {
return (([obj intValue] % 2) == 0);
};
BoolDictionaryBlock isEvenDictBlock = ^BOOL(id key, NSNumber *obj) {
return (([obj intValue] % 2) == 0);
};
NSNumber *ctEvenArr = [numberArray countValidEntries:isEvenArrayBlock];
NSNumber *ctEvenDict = [numberDict countValidEntries:isEvenDictBlock];
NSLog(@"The number of even elements are : Array %@ - Dict %@", ctEvenArr, ctEvenDict);
删除迭代器返回 true 的第一个项之前的所有项。
- (NSArray *) dropWhile:(BoolArrayBlock) block;
NSArray *droppedUntilThree = [numberArray dropWhile:^BOOL(NSNumber *nr) {
return ([nr integerValue] < 3);
}];
NSLog(@"Array from 3 : %@", droppedUntilThree);
返回集合中的最大和最小值。您需要编写一个比较器,用于比较两个元素。
- (id) max:(CompareArrayBlock) block;
- (id) min:(CompareArrayBlock) block;
- (id) max:(CompareDictBlock) block;
- (id) min:(CompareDictBlock) block;
以下示例演示了如何从上面的数组和字典中获取最小和最大值
CompareArrayBlock compareArrBlock = ^NSComparisonResult(NSNumber *a, NSNumber *b) {
return [a compare:b];
};
CompareDictBlock compareDictBlock = ^NSComparisonResult(id k1, NSNumber *v1, id k2, NSNumber *v2) {
return [v1 compare:v2];
};
NSNumber *maxArr = [numberArray max:compareArrBlock];
NSNumber *maxDict = [numberDict max:compareDictBlock];
NSLog(@"Max : Array %@ - Dict %@", maxArr, maxDict);
#pragma mark - min
NSNumber *minArr = [numberArray min:compareArrBlock];
NSNumber *minDict = [numberDict min:compareDictBlock];
NSLog(@"Min : Array %@ - Dict %@", minArr, minDict);
排序实际上是 [self sortedArrayUsingComparator:block];
的别名
- (NSArray *) sort:(NSComparator) block;
请参阅 NSArray sortedArrayUsingComperator: 了解详细信息。
以下是一个示例
NSComperator compareArrBlock = ^NSComparisonResult(NSNumber *a, NSNumber *b) {
return [a compare:b];
};
NSArray *nrReversed = [numberArray reverse];
NSArray *sorted = [nrReversed sort:compareArrBlock];
NSLog(@"%@ becomes %@ when sorted", nrReversed, sorted);
通过迭代器返回的值对数组进行分组。
- (NSDictionary *) group:(MapArrayBlock) block;
以下示例将数组分组成奇数部分和偶数部分
NSDictionary *oddEvenArray = [numberArray group:^NSString *(NSNumber *obj) {
if (([obj intValue] % 2) == 0) return @"even";
else return @"odd";
}];
NSLog(@"Grouped array %@", oddEvenArray);
对 NSNumber
(n) 调用 times 以循环 n 次执行给定的 block。
- (void) times:(VoidBlock) block;
以下是一个简单的示例 - 它打印 'have i told you' 一次
NSNumber *howMany = [numberArray first];
[howMany times:^{
NSLog(@"have i told you?");
}];
创建一个包含范围的数组,作为一个個 NSNumbers。
+ (NSArray *) arrayFrom:(NSInteger) from To:(NSInteger) to;
示例
NSArray *rArr = [NSArray arrayFrom:0 To:3];
NSLog(@"Array from 0 to 3 %@", rArr);
- (id) first;
仅为 [array objectAtIndex:0]
的快捷方式。
- (NSArray *) reverse;
返回反转后的数组。
这些是辅助函数。它们返回它们被调用的数组直到(不包括)给定的索引或从给定的索引开始(包括)的元素。
- (NSArray *) arrayUntilIndex:(NSInteger) idx;
- (NSArray *) arrayFromIndexOn:(NSInteger) idx;
NSArray *untilTwo = [numberArray arrayUntilIndex:2];
NSArray *afterTwo = [numberArray arrayFromIndexOn:2];
NSLog(@"The array until idx 2 : %@ and thereafter : %@", untilTwo, afterTwo); // 1,2 and 3,4,5