Functional.m 1.0.0

Functional.m 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 BSD
发布最后发布2014年12月

未声明 维护。



  • Hannes Walz

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

each

给定的迭代器对集合中的每个对象运行。

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

map

集合中的每个对象都可以在迭代器中转换。

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

reduce

将集合中的所有对象归约成一个值(例如计算平均值等)

  • - (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 和 reject

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 和 isValidForAny

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

countValidEntries

计算集合中返回 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);

dropWhile

删除迭代器返回 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);

times

NSNumber (n) 调用 times 以循环 n 次执行给定的 block。

  • - (void) times:(VoidBlock) block;

以下是一个简单的示例 - 它打印 'have i told you' 一次

    NSNumber *howMany   = [numberArray first];
    [howMany times:^{
        NSLog(@"have i told you?");
    }];

NSArray 扩展

arrayFrom:To

创建一个包含范围的数组,作为一个個 NSNumbers。

  • + (NSArray *) arrayFrom:(NSInteger) from To:(NSInteger) to;

示例

    NSArray *rArr = [NSArray arrayFrom:0 To:3];
    NSLog(@"Array from 0 to 3 %@", rArr);

first

  • - (id) first;

仅为 [array objectAtIndex:0] 的快捷方式。

reverse

  • - (NSArray *) reverse;

返回反转后的数组。

arrayUntilIndex 和 arrayFromIndexOn

这些是辅助函数。它们返回它们被调用的数组直到(不包括)给定的索引或从给定的索引开始(包括)的元素。

  • - (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