Применение определенных с помощью программы функций к наборам

Особенно полезная функция наборов является возможностью применения определенной с помощью программы функции к каждому значению в объекте коллекции. Эта функция applier должна соответствовать прототипу, определенному для каждого типа набора. Необходимо указать указатель на эту функцию в функциях набора (формы CFВвестиApplyFunction) это вызывает его на каждое содержавшее значение.

Перечисление 1 обеспечивает простой пример, применяющий считающую символ функцию к объектам CFString, хранившим в объекте CFArray. Эта функция имеет тип CFArrayApplierFunction. Этот прототип имеет два параметра: первым является значение в массиве (или указатель на то значение), и вторым является некоторое определенное с помощью программы значение (или указатель на то значение).

Перечисление 1  , Применяющее функцию к массиву

void countCharacters(const void *val, void *context) {
    CFStringRef str = (CFStringRef)val;
    CFIndex *cnt = (CFIndex *)context;
    CFIndex numchars = CFStringGetLength(str);
    *cnt += numchars;
}
 
void countCharsInArray() {
    CFStringRef strs[3];
    CFArrayRef anArray;
    CFIndex count=0;
 
    strs[0] = CFSTR("String One");
    strs[1] = CFSTR("String Two");
    strs[2] = CFSTR("String Three");
 
    anArray = CFArrayCreate(NULL, (void *)strs, 3, &kCFTypeArrayCallBacks);
    CFArrayApplyFunction(anArray, CFRangeMake(0,CFArrayGetCount(anArray)), countCharacters, &count);
    printf("The number of characters in the array is %d", count);
    CFRelease(anArray);
}

Часто функция applier используется для итерации по непостоянному набору для удаления объектов, соответствующих определенные критерии. Никогда не безопасно видоизменить набор, в то время как функция applier выполняет итерации по нему. Однако существуют некоторые безопасные способы использовать функцию applier для видоизменения набора:

То, какой подход проще, зависит от ситуации. Если исходный набор является неизменным, то можно использовать изменение: