Получение значений наборов

Как описано в Общих характеристиках Наборов, с 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 может быть допустимое значение в этих наборах, CFВвестиGetValueIfPresent функции точно сообщают о существовании содержавшего значения. Перечисление 3 показывает приложение функции CFSetGetValueIfPresent в функции, использующей объект CFSet гарантировать уникальность строк.

Перечисление 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 включают другой Получать функции. Некоторые функции получают все значения (и ключи) в наборе, некоторый возврат количество значений (или ключи) в наборе, и некоторые получают индекс или ключ, связанный с указанным значением.