コレクションの値を取得


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 オブジェクトから値を取得するには、値自体をキーとして指定しなければなりません。これは奇妙に思えるかもしれませんが、作成されたオブジェクト (hashequal) の等価性を決定する呼び出し関数を定義できるので、キーとして使用される値は格納された値と正確に同じである必要はありません。


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 関数を含みます。いくつかの関数はコレクション内のすべての値 (およびキー) を取得し、いくつかはコレクション内の値 (またはキー) のカウントを返し、いくつかは指定された値に関連したインデックスまたはキーを取得します。


前の章 次の章



目次
Xcode の新機能

  • 序文
  • この文書の構成
  • コレクションの共通の特徴
  • 動作は呼び出し関数によって決定される
    大部分のコレクションが変更不可能な変種を提供
  • コレクションの型
  • 配列
    辞書
    セットとバッグ
    樹 (Trees)
    コレクションのカスタマイズ
  • コレクションの作成とコピー
  • カスタムコレクション呼び出し関数の定義
    コレクションの値を取得
    コレクションの検索
    変更可能なコレクションの操作
    コレクションにプログラム定義関数を適用
  • 樹構造の作成と使用
  • CFTree オブジェクトの作成
    親に樹を追加する
    子の樹の取得
    CFTree 構造体でのその他の操作
    文書改訂履歴












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)