测试已测试 | ✓ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2015年3月 |
由 Andrey Tarantsov 维护。
NSArray 和 NSDictionary 分类,帮助您编写更具有表达力的代码。
理由,3个简单的陈述
有3种类型的代码
混合这类代码在单一方法中是个坏主意。
所以当你发现自己正在同一个方法中编写多行集合处理代码和多行API交互/领域逻辑代码时,你应该将算法部分提取到单独的辅助方法中。
ATExpressiveCollections 是从我的应用程序中提取的一组算法辅助器,历时已久。
有用提示:当使用这些方法时,请记住,你可以在块参数列表中将“id”替换为你的特定类型。
请参见以下文档和示例,或查看头文件
使用 CocoaPods
pod 'ATExpressiveCollections', '~> 1.0'
我将接受所有满足以下要求的 pull request
不要引入向后不兼容的破坏性更改。
为所有新(或修改的)功能提供测试用例。
在 README.md 中记录新(或修改的)功能。
遵循当前的代码格式风格。
所有名称前缀为 at_
。
我的目标是使用自解释的方法名,这样人们可以在不查看文档的情况下理解代码。请花些时间思考您要引入的方法名。
映射
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"]};
按键值交换的字典
[@{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
}
递归合并字典条目
根据块返回值的数组
使用块映射键
使用块映射值