Применение определенных с помощью программы функций к наборам
Особенно полезная функция наборов является возможностью применения определенной с помощью программы функции к каждому значению в объекте коллекции. Эта функция 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 для видоизменения набора:
Видоизменитесь после итерации. Используйте прикладную функцию для записи, где изменения необходимы в наборе, и затем видоизменяют набор после того, как функция applier заканчивает выполняться.
Видоизмените оригинал. Если набор является непостоянным, сделайте копию набора и используйте функцию applier, чтобы выполнить итерации по копии и видоизменить оригинал.
То, какой подход проще, зависит от ситуации. Если исходный набор является неизменным, то можно использовать изменение:
Видоизмените копию. Сделайте непостоянную копию набора и используйте функцию applier, чтобы выполнить итерации по оригиналу и видоизменить копию.