ATExpressiveCollections 1.1.0

ATExpressiveCollections 1.1.0

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

Andrey Tarantsov 维护。



NSArray 和 NSDictionary 分类,帮助您编写更具有表达力的代码。

理由,3个简单的陈述

  1. 有3种类型的代码

    • 算法/数据结构密集型代码(例如:“创建具有给定容量的空数组,迭代输入集合,对每个元素执行测试,将通过测试的元素添加到输出数组”)
    • API密集型代码(例如:“获取文件管理器,请求给定资源的属性,检查错误”)
    • 领域逻辑(例如:“忽略缺失的文件”)
  2. 混合这类代码在单一方法中是个坏主意。

  3. 所以当你发现自己正在同一个方法中编写多行集合处理代码和多行API交互/领域逻辑代码时,你应该将算法部分提取到单独的辅助方法中。

ATExpressiveCollections 是从我的应用程序中提取的一组算法辅助器,历时已久。

有用提示:当使用这些方法时,请记住,你可以在块参数列表中将“id”替换为你的特定类型。

请参见以下文档和示例,或查看头文件

安装

使用 CocoaPods

pod 'ATExpressiveCollections', '~> 1.0'

贡献策略

我将接受所有满足以下要求的 pull request

  1. 不要引入向后不兼容的破坏性更改。

  2. 为所有新(或修改的)功能提供测试用例。

  3. 在 README.md 中记录新(或修改的)功能。

  4. 遵循当前的代码格式风格。

  5. 所有名称前缀为 at_

我的目标是使用自解释的方法名,这样人们可以在不查看文档的情况下理解代码。请花些时间思考您要引入的方法名。

NSArray

映射

  • at_arrayWithValuesOfBlock:(其他一些库称之为“map”)

    NSArray *result = [array at_arrayWithValuesOfBlock:^id(NSString *value, NSUInteger idx) {
        return [value uppercaseString];
    }];
    
  • at_arrayWithValuesOfKeyPath:(其他一些库称之为“pluck”)

    NSArray *result = [array at_arrayWithValuesOfKeyPath:@"uppercaseString"];
    

    如果您想知道,这几乎与 `[array valueForKeyPath:...]` 完全相同,但我们跳过了 nil 值而不是将它们转换为 NSNull。

过滤

  • at_arrayOfElementsPassingTest

    NSArray *result = [array at_arrayOfElementsPassingTest:^BOOL(NSString *value, NSUInteger idx) {
        return [value rangeOfString:@"o"].location != NSNotFound;
    }];
    

搜索

  • at_firstElementPassingTest:, at_lastElementPassingTest:

    id result = [@[@11, @42, @26, @14, @30] at_firstElementPassingTest:^BOOL(id value, NSUInteger idx, BOOL *stop) {
        return [value integerValue] >= 20;
    }];
    

排序

  • at_minimalElement, at_maximalElement

    id result = [@[@11, @42, @26, @14, @30] at_maximalElement]  // @42
    
  • 使用分离的评分块的最小/最大元素

    at_minimalElementOrderedByIntegerScoringBlock:
    at_maximalElementOrderedByIntegerScoringBlock:
    at_minimalElementOrderedByDoubleScoringBlock:
    at_maximalElementOrderedByDoubleScoringBlock:
    at_minimalElementOrderedByObjectScoringBlock:
    at_maximalElementOrderedByObjectScoringBlock:
    

    示例

    id result = [@[@11, @42, @26, @14, @30] at_minimalElementOrderedByIntegerScoringBlock:^NSInteger(NSNumber *value, NSUInteger idx) {
        return [value integerValue] % 10;
    }];
    

分组

  • at_keyedElementsIndexedByValueOfBlock

    NSDictionary *result = [@[@"foo", @"bar", @"boz"] at_keyedElementsIndexedByValueOfBlock:^id(NSString *value, NSUInteger idx) {
        return [value uppercaseString];
    }];
    // returns @{@"FOO": @"foo", @"BAR": @"bar", @"BOZ": @"boz"};
    
  • at_keyedElementsIndexedByValueOfKeyPath

    NSDictionary *result = [@[@"f", @"ba", @"boz"] at_keyedElementsIndexedByValueOfKeyPath:@"length"];
    // returns @{@1: @"foo", @2: @"bar", @3: @"boz"};
    
  • at_dictionaryMappingElementsToValuesOfBlock

    NSDictionary *result = [@[@"foo", @"bar", @"boz"] at_dictionaryMappingElementsToValuesOfBlock:^id(NSString *value, NSUInteger idx) {
        return [value uppercaseString];
    }];
    // returns @{@"foo": @"FOO", @"bar": @"BAR", @"boz": @"BOZ"};
    

多实例分组

  • at_keyedArraysOfElementsGroupedByValueOfBlock

    NSDictionary *result = [@[@"foo", @"bar", @"Foo"] at_keyedArraysOfElementsGroupedByValueOfBlock:^id(NSString *value, NSUInteger idx) {
        return [value uppercaseString];
    }];
    // returns @{@"FOO": @[@"foo", @"Foo"], @"BAR": @[@"bar"]};
    
  • at_keyedArraysOfElementsGroupedByValueOfKeyPath

    NSDictionary *result = [@[@"foo", @"bar", @"fubar"] at_keyedArraysOfElementsGroupedByValueOfKeyPath:@"length"];
    // returns @{@3: @[@"foo", @"bar"], @5: @[@"fubar"]};
    

NSDictionary

  • 按键值交换的字典

    [@{A: P, B: Q, C: R} at_dictionaryByReversingKeysAndValues]  ⇒  @{P: A, Q: B, R: C}
    
  • 从字典中添加条目

  • 合并字典条目:使用块

    [first at_dictionaryByMergingEntriesFromDictionary:second usingBlock:^id(id key, id oldValue, id newValue) {
        // return the result of merging oldValue with newValue
    }
    
  • 递归合并字典条目

  • 根据块返回值的数组

  • 使用块映射键

  • 使用块映射值