これをどのように進めたいかを示すコードがないと、何を求めているのかを正確に確認することは難しく、質問には少し混乱があります。
まず、述語はまさにそれです。つまり、真か偽かを証明できるステートメントです。したがって、述語は、コア データなどのデータベース クエリで暗黙的に使用されるものを含め、論理式で使用されます。
あなたの質問を正しく読めば、それはあなたが望むものではありません。必要なのは、データ モデルの複雑さを軽減し、その過程で余分な (希望する) 情報を削除することです。辞書の配列の一種の平坦化。
けっこうだ。
また、述語との混同がどのように生じたかもわかります。ほとんどの場合、述語は Key-Value Coding を使用して構築されます。KVC としても知られているように、目的を達成できる非常に強力な手法です。論理ステートメントとはあまり関係がありません。
それを解決した後、KVC を使用すると、必要なことを最小限の手間で行うことができます。こんなふうになります:
NSArray *values = [myArray valueForKeyPath: @"@unionOfArrays.@allValues"];
NSArray *keys = [myArray valueForKeyPath: @"@unionOfArrays.@allKeys"];
簡単な説明が適切かもしれません:
私たちが望む結果は
- 各ディクショナリのすべての値 (またはキー) で、値 (またはキー) の配列の配列を取得します。
- 次に、これらの配列を 1 つの配列にフラット化します。
KVC を使用してディクショナリからすべての値 (またはキー) を取得するための特別なキーは、それぞれ@allValues
または@allKeys
です。
この@unionOfArrays
演算子は、それに続く式から取得した配列の和集合を作成します。つまり、必要な配列にフラット化します。
このコーディングの単純さに対して支払う代償は、KVC キー パスをコレクション オペレーターと共に使用する必要があることです。コレクション オペレーターは、コード内の単なる文字列です。したがって、構文に関するコンパイラからのヘルプが失われ、入力したキーがオブジェクトに存在するかどうかがチェックされません。同様に、たとえば入力ミスや間違った演算子を使用した場合、デバッガーとエラー メッセージは役に立ちません。