コレクションにプログラム定義関数を適用
コレクションの特に有用な機能は、コレクションオブジェクト内の各値にプログラム定義の関数を適用する機能です。この適合 (applier) 関数は、各コレクション型に対して定義されたプロトタイプに準拠しているなければなりません。この関数へのポインタは、含まれる各値で呼び出すコレクション関数 (CFTypeApplyFunction の形式) で指定しなければなりません。
リスト 1 は、CFArray オブジェクトに格納されている CFString オブジェクトに文字数計算関数を適用する簡単な例を示しています。この関数の型は CFArrayApplierFunction です。このプロトタイプには2つのパラメータがあります。最初は配列の値 (またはその値へのポインタ) で、2 番目はプログラム定義の値 (またはその値へのポインタ) です。
リスト 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); }
多くの場合、適合関数を使用して、変更可能なコレクションを反復処理し、特定の基準に一致するオブジェクトを削除します。適合関数がそれを反復している間にコレクションを変更することは決して安全ではありません。ただし、適合関数を使用してコレクションを変更するには、いくつか安全な方法があります。
- 反復処理後に変更 (mutate) します。適合関数を使用して、コレクションに変更が必要な場所を記録し、適合関数の実行が終了した後にコレクションを変更します。
- オリジナルを変更 (mutate) します。コレクションが変更可能な場合は、コレクションのコピーを作成し、適合関数を使用してコピーを反復処理し、オリジナルを変更します。
どのアプローチがより簡単かは、状況によって異なります。オリジナルのコレクションが不変の場合は、バリエーションを使用できます。
- コピーを変更 (mutate) します。コレクションの変更可能なコピーを作成し、適合関数を使用してオリジナルを反復処理し、コピーを変更 (mutate) します。