Objective-C 的列表推导。
列表推导,就像在许多其他语言中的那样,对于从其他列表中构建列表非常有用。以下是一个简单示例,用 Haskell 实现
[[a,b] | a <- [1,2,3], b <- [4,5,6]]
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
推导式接受一个函数和一个或多个列表,并返回一个新的列表。传递给推导式的列表按从右到左的方式以嵌套方式列举,也就是说,如果您将上面的示例翻译成普通的 Objective-C,它将看起来像这样:
NSMutableArray array = [NSMutableArray array];
for(id obj in @[@1,@2,@3]) {
for(id obj1 in @[@4,@5,@6]) {
array addObject:@[obj, obj1]];
}
}
普通的 Objective-C 版本相当冗长且冗余。这时就出现了 TJLListComprehension。
NSArray *list1 = @[@1, @2, @3];
NSArray *list2 = @[@4, @5, @6];
NSArray *array = [TJLListComprehension listComprehensionWithLists:@[list1, list2] function:^id(id obj, id obj1) {
return @[obj, obj1];
}];
这三个示例都产生相同的列表,但第一个和最后一个示例让您摆脱了自己编写循环和可变容器的工作,并让您专注于真正想要完成的任务。此外,请注意,函数可以返回任何对象,但这个例子只是使用从现有列表中创建新多维列表作为一个示例。
也可以用谓词函数对列表进行筛选
NSArray *list1 = @[@1, @2, @3];
NSArray *list2 = @[@4, @5, @6];
NSArray *array = [TJLListComprehension listComprehensionWithLists:@[list1, list2] function:^id(id obj, id obj1) {
return @[obj, obj1];
} predicate:^BOOL(NSNumber *obj, NSNumber *obj1) {
return (obj.integerValue + obj1.integerValue) % 2 == 0;
}];
如果谓词返回 YES,则将应用函数并将这些元素添加到新列表中;如果它返回 NO,则不会应用函数并将这些元素不添加到列表中。
在用 +TJLListComprehension listComprehensionWithLists:function:
创建列表推导时,您应该传递一个列表的列表,就像上面的例子一样。使用数组的字面量是一个方便的方法来做这件事。任何符合 NSFastEnumeration
的事物都可以传递给列表参数。
函数参数被类型化为简单的 id
,但它是一个可以接受可变数量参数的块,这些参数应该与列表参数中传递的参数数量相同。
TJLMemoization 使用 cocoapods,所以只需将 pod 'TJLListComprehension' 'version'
放入您的 podfile 中,然后像平常一样进行安装。然后在您想要使用它的任何地方只需 #import <TJLListComprehension/TJLListComprehension.h>
即可。
如果您使用了 TJLListComprehension 并且喜欢它,请随时告诉我,[email protected]。如果您有任何问题或想进行改进,请提交一个 pull 请求。
MIT 许可证 (MIT) 版权所有 © 2014 Terry Lewis II
本朽许可任何人免费获得本软件及其相关文档文件(以下简称“软件”)的副本,无需支付任何费用。在不限于此的前提下,包括但不限于使用、复制、修改、合并、发布、分发、许可和/或销售软件副本的权利,并允许获得软件的人员进行此类操作,但须遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任(无论基于合同、侵权或其他法律论点)负责。此责任包括但不限于与软件、使用或以其他方式处理软件相关的、在任何情况下产生的、包括但不限于此类责任。