0

配列を含む 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;
});
4

1 に答える 1

2

これやその他の抽象化を使用すると、プロセスの構造を考えるのに役立ちます。意味的には、配列の配列を 1 つの配列にフラット化することは折りたたみです。したがって、このコードはそれをかなり直接的に実装しています。NSMutableArray *(余談ですが、一時的な割り当てを行う代わりに、メモをではなくとして入力できることをご存知idですか? 勝利のための共分散!)

一方、結果の配列よりもネストされた配列内のオブジェクトを順番にトラバースすることに関心がある場合、本当に必要なのは、含まれている各配列のトラバーサルで構成されるトラバーサルです。

その時点で配列に折りたたむことができRXConstructArray()ますが、最終的な配列値を生成する必要がない場合は、純粋に遅延プロセスになります。

これに関する 2 つの注意事項:

  1. RXConstructArray()Core Data fetch が set で動作するのと同様に、遅延入力された配列を返しますfetchBatchSize

  2. の使用にRXFold()は実際には必要ありませんRXConstructArray()。これは、トラバーサルではなく、ブロックの最終評価によって生成されたメモを返すためです。技術的な詳細では、これはRXFold()遅延ではなく厳密に評価されるためです。ただし、ObjC の遅延フォールド関数は楽しいプロジェクトのように思えます。

于 2013-10-10T14:45:04.293 に答える