我对包含阵列的NSArray进行展平的典型模式如下:
NSMutableArray *flattenedArray = [NSMutableArray array];
for (NSArray *innerObjects in arrayToFlatten) {
[flattenedArray addObjectsFromArray:innerObjects];
}
(或者我使用@unionOfArrays KVC集合运算符)。
使用RXCollections的最佳等价物是什么?我有:
NSArray *flattenedArray = RXConstructArray(RXFold(arrayToFlatten, [NSMutableArray array], ^id(id memo, id each,
bool *stop) {
NSMutableArray *accumulator = memo;
[accumulator addObjectsFromArray:each];
return accumulator;
}));
但是使用NSMutableArray累加器对我来说有些不协调。
我已经离开了上面的原文,以免弄错Rob的回答,但(迄今为止)改进的版本是:
NSArray *flattenedArray = RXFold(arrayToFlatten, [NSMutableArray array], ^id(NSMutableArray *accumulator, NSArray *array,
bool *stop) {
[accumulator addObjectsFromArray:array];
return accumulator;
});
答案 0 :(得分:2)
当使用它或任何其他抽象时,我发现它有助于我思考过程的结构。从语义上讲,将数组数组展平为单个数组是一种折叠;所以这段代码直接实现了。 (旁白:您知道吗,您只需将备忘录键入NSMutableArray *
而不是id
,而不是进行临时分配?胜利的协方差!)
另一方面,如果你更关心按顺序遍历嵌套数组中的对象而不是结果数组,那么你真正想要的是一个遍历每个包含数组的遍历。
此时你可以将它折叠成一个RXConstructArray()
的数组,但是如果你不需要产生最终的数组值,你就会有一个纯粹的延迟过程。
关于此的两点说明:
RXConstructArray()
返回一个延迟填充的数组,类似于Core Data提取的fetchBatchSize
设置工作方式。
您对RXFold()
的使用实际上并不需要RXConstructArray()
,因为它正在返回由对块的最终评估产生的备忘录,而不是遍历。在技术细节中,这是因为RXFold()
严格评估,而不是懒惰;然而,ObjC中的懒惰折叠功能听起来像是一个有趣的项目!