コレクションの値を取得
CFArray、CFDictionary、CFSet、および CFBag コレクションオブジェクトは、コレクションの共通の特徴 に説明したように、(一般的な意味で理解されるように) キーを使用して格納された値を取得します。値を取得するために使用されるキーは、コレクションの型によって異なります。
- CFArray オブジェクトでは、キーは配列内の相対位置を識別するインデックス整数です。
- CFDictionary オブジェクトでは、キーは辞書の値に関連した任意の定数のデータです。"キー" という用語は、この関連するデータを指定するために従来使用されていました。
- CFSet および CFBag オブジェクトでは、キーは値そのものです。
すべてのコレクションオブジェクトは、名前に部分文字列 "GetValue" が含まれる値取得関数を定義します。これらの関数は、適切な種類のキーをそのパラメータとして取ります。
配列の値にアクセスするには、一般的な手法として、コレクションをループで繰り返し処理し、各パスでインデックスを増分します。ループの本体の中で、現在のインデックスをキーとして使用して値にアクセスし、必要に応じて値をテストし、使用します。リスト 1 に、このテクニックの例を示します。
リスト 1 : CFArray オブジェクト内の値の取得
if (URLs != NULL) { /* URLs is a CFArray object */
CFIndex i, c = CFArrayGetCount(URLs);
CFURLRef curURL;
CFBundleRef curBundle;
for (i=0; i<c; i++) {
curURL = CFArrayGetValueAtIndex(URLs, i);
curBundle = CFBundleCreate(alloc, curURL);
if (curBundle != NULL) {
CFArrayAppendValue(bundles, curBundle);
CFRelease(curBundle);
}
}
CFRelease(URLs);
}
CFDictionary オブジェクト内で値を取得するための主な関数は、値のキーを指定する必要がある CFDictionaryGetValue です。リスト 2 にその例を示します。
リスト 2 : CFDictionary オブジェクト内の値の取得
CFStringRef theName = mappingTable ? (CFStringRef)CFDictionaryGetValue(mappingTable, (const void*)encoding) : NULL;
CFSet および CFBag オブジェクトから値を取得するには、値自体をキーとして指定しなければなりません。これは奇妙に思えるかもしれませんが、作成されたオブジェクト (hash とequal) の等価性を決定する呼び出し関数を定義できるので、キーとして使用される値は格納された値と正確に同じである必要はありません。
CFSet、CFBag、および CFDictionary はすべて、コレクション内に存在する場合にのみ指定された値を取得する関数を定義します。これらのコレクションでは NULL が有効な値であるため、CFTypeGetValueIfPresent 関数は含まれる値の存在を正確に報告します。リスト 3 は、CFSet オブジェクトを使用して文字列の一意性を保証する関数内の関数 CFSetGetValueIfPresent のアプリケーションを示しています。
リスト 3 : 一意の値に CFSet オブジェクトを使用する
static CFMutableSetRef uniquedStrings = NULL;
CFStringRef uniqueString(CFStringRef string,
Boolean addIfAbsent) {
CFStringRef member = NULL;
Boolean present;
if (!string) {
return NULL;
}
if (!uniquedStrings) {
if (addIfAbsent) {
uniquedStrings = CFSetCreateMutable(NULL, 0, &
kCFTypeSetCallBacks);
} else {
return NULL;
}
}
present = CFSetGetValueIfPresent(uniquedStrings,
string, (void **)&member);
if (!present) {
if (addIfAbsent) {
string = CFStringCreateCopy(NULL, string);
CFSetAddValue(uniquedStrings, string);
CFRelease(string);
}
member = string;
}
return member;
}
コレクション型 CFArray、CFDictionary、CFSet、および CFBag には、他の Get 関数を含みます。いくつかの関数はコレクション内のすべての値 (およびキー) を取得し、いくつかはコレクション内の値 (またはキー) のカウントを返し、いくつかは指定された値に関連したインデックスまたはキーを取得します。
前の章 次の章