4

この質問は、オブジェクトの NSArray からプロパティを抽出するのと似ていますが、より深く抽出するためのものです。

簡単にするために、以下の例で参照しているオブジェクトは NSStrings です。

解決したいケースが 2 つあります。

オブジェクトを持つ NSDictionary の NSArray の NSArray

できればキー値コーディングを使用して、次の構造から、すべての「タイトル」を単一の列挙可能なリストに抽出したいと思います。

NSArray *list1 = @[
    @[
        @{@"title":@"A", @"description":...},
        @{@"title":@"B", @"description":...},
    ],
    @[
        @{@"title":@"C", @"description":...},
        @{@"title":@"D", @"description":...},
    ],
];

望ましい結果は、たとえば次のようになります。

@[@"A", @"B", @"C", @"D"]

オブジェクトの NSArray を持つ NSDictionary の NSArray

できればキー値コーディングを使用して、次の構造から、「タイトル」のリストを単一の列挙可能なリストに抽出したいと思います。

NSArray *list2 = @[
    @{
        @"titles":@[
            @"A",
            @"B",
        ],
        @"descriptions":...,
    },
    @{
        @"titles":@[
            @"C",
            @"D",
        ],
        @"descriptions":...,
    },
];

望ましい結果は、たとえば次のようになります。

@[@"A", @"B", @"C", @"D"]

ノート

  • 私の実際のケースにはNSOrderedSetNSOrderedSet最初のリストNSOrderedSetのオブジェクトNSDictionaryNSOrderedSet2 番目のリストのオブジェクトが含まれますが、それは私が考える答えに影響を与えるべきではありません。

  • キー値コーディングを使用したいと書きましたが、それは必須ではありません。for (... in ...)可能であれば、またはを書くことは避けたいだけですenumateObjectWithBlock:

  • これも問題ではありませんが、オブジェクトはフェッチ要求からの NSManagedObject です。したがって、フェッチ要求を直接最適化できることはわかっていますが、それでも良い代替手段があるかどうかを知りたいです。

4

2 に答える 2

1

Josh さん、NSArray に関する回答をありがとうございます。質問した際は、現代的な@[]構文の方が書きやすいのでNSArrayで記述しました。NSArrayに対する最も適切な答えが、私の実際のNSOrderedSet.

したがって、私の実際のケースはそれに近いです。

NSOrderedSet *list1 = [NSOrderedSet orderedSetWithObjects:[NSOrderedSet orderedSetWithArray:@[ @{@"title":@"A"}, @{@"title":@"B"} ]], [NSOrderedSet orderedSetWithArray:@[ @{@"title":@"C"}, @{@"title":@"D"} ]], nil];
NSOrderedSet *list2 = [NSOrderedSet orderedSetWithArray:@[ @{ @"titles":[NSOrderedSet orderedSetWithObjects: @"A", @"B", nil] }, @{ @"titles":[NSOrderedSet orderedSetWithObjects: @"C", @"D", nil] } ]];

そして、私が見つけることができる NSOrderedSet の唯一の解決策は、悲しいことにループを使用することです:

NSMutableOrderedSet *listA = [NSMutableOrderedSet orderedSet];
for (NSOrderedSet *set in [list1 valueForKey:@"title"]) {
    [listA unionOrderedSet:set];
}

NSMutableOrderedSet *listB = [NSMutableOrderedSet orderedSet];
for (NSDictionary *object in list2) {
    [listB unionOrderedSet:object[@"titles"]];
}

[編集: どうやら Josh@arrayは問題を解決するために文書化されていないオペレーターを見つけたようです。コントラッツ!】

于 2015-08-03T09:01:48.313 に答える