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