コレクションの検索
Core Foundation には、コレクションオブジェクトの値 (および CFDictionary の場合はキー) を検索するためのいくつかのプログラミングインターフェイスが含まれています。コレクションの値を取得 で説明したように、CFTypeGetValueIfPresent 関数は、辞書、セット、およびバッグの値の存在をレポートします。名前に "Contains" のある関数も使用して、コレクションが値またはキーを保持しているかどうかを判断することもできます。リスト 1 は、CFDictionaryContainsKey 関数の使用方法を示しています。
リスト 1 : CFDictionary オブジェクトでキーの検索
if (CFDictionaryContainsKey(mappingTable, (const void*)lowerCharsetName)) { result = (CFStringEncoding)CFDictionaryGetValue(mappingTable, (const void*)lowerCharsetName); }
CFArray オブジェクトの場合、CFArrayBSearchValues 関数はより洗練された検索オプションを提供します。この関数は、バイナリ検索アルゴリズムを使用して、ソートされた配列内の指定された値を検索します。値がコレクション内に存在しない場合、関数はそれがどこに行ってしまったかを指示します。CFArrayBSearchValues 関数はソートされた変更可能な配列をソートされた状態に保つのに役立ちます。リスト 2 は、この関数の呼び出し方法を示しています。
リスト 2 : CFArray オブジェクト内で値の検索
CFIndex position = CFArrayBSearchValues(aMutArray, CFRangeMake(0,CFArrayGetCount(anArray)), (const void *)CFSTR("String Three"), CFStringCompare, 0);
CFArrayBSearchValues 関数の 4 番目のパラメータは、CFComparatorFunction 型に準拠する関数へのポインタでなければなりません。このコンパレータ関数は、配列内の値を比較する方法を知っているはずです。この例では CFStringCompare は CFComparatorFunction に準拠しており、CFString の値を比較する方法を知っているため使用されています。CFNumberCompare や CFDateCompare など、使用できるその他の既に定義された Core Foundation のコンパレータ関数があります。
上記の呼び出しが返ってくると、関数の CFIndex の結果は次のいずれかを示します:
- 値が存在する場合、配列内のそのインデックス
- 指定された値が範囲のすべての値より大きい場合、範囲の終了点以上のインデックス値。値が範囲内の値の 2 つの間 (またはすべての値の未満) にある場合、指定された値より大きい値のインデックス。
CFArrayContainsValue を使用して、結果がリストされている案のうち最初のものかどうかを判断できます。
CFTree 型は、含まれている値 (つまり、サブツリー) を検索するための異なるグループの関数を定義します。詳細については、コレクションの作成とコピー を参照してください。
前の章 次の章