gpt4 book ai didi

objective-c - 如何使用 RXCollections 展平嵌套 NSArray

转载 作者:行者123 更新时间:2023-12-03 17:40:05 27 4
gpt4 key购买 nike

我的扁平化包含数组的 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 累加器的使用对我来说有点不协调。

<小时/>

我保留了上面的原始内容,以免罗布的答案变得无意义,但(迄今为止)改进的版本是:

NSArray *flattenedArray = RXFold(arrayToFlatten, [NSMutableArray array], ^id(NSMutableArray *accumulator, NSArray *array,
bool *stop) {
[accumulator addObjectsFromArray:array];
return accumulator;
});

最佳答案

当使用这个或任何其他抽象时,我发现它可以帮助我思考流程的结构。从语义上讲,将数组的数组展平为单个数组是折叠;所以这段代码非常直接地实现了这一点。 (旁白:您是否知道您可以将备忘录输入为 NSMutableArray * 而不是 id,而不是进行临时分配?协方差获胜!)

另一方面,如果您更关心按顺序遍历嵌套数组中的对象而不是结果数组,那么您真正想要的是由每个包含的数组的遍历组成的遍历。

此时您可以使用 RXConstructArray() 将其折叠到一个数组中,但如果您不需要生成最终的数组值,那么您将有一个纯粹的惰性过程。

关于此的两个注意事项:

  1. RXConstructArray() 返回一个延迟填充的数组,类似于 Core Data 获取与 fetchBatchSize 设置的工作方式。

  2. 您使用 RXFold() 实际上并不需要 RXConstructArray(),因为它返回的是由 block 的最终评估生成的备忘录,不是遍历。从技术细节来看,这是因为 RXFold() 会严格计算,而不是惰性计算;不过,ObjC 中的惰性折叠函数听起来是一个有趣的项目!

关于objective-c - 如何使用 RXCollections 展平嵌套 NSArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19284533/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com