KVC: Set And Array Operators 概要
KVC (Key-Value Coding) の Set And Array Operators をマスターすると、コードを簡素化できたり、NSPredicate でできることの幅が増えたり、Cocoa Bindings でできることの幅が増えるなどの利点があります。今回から数回に渡って、Set And Array Operators を取り上げます。
初回である今回は、Set And Array Operators の概要を説明します。
Set And Array Operators は、valueForKeyPath: に渡すキーパスに、ちょっとした演算を組み込むための演算子です。
以下の11こが用意されています:
@avg
@count
@distinctUnionOfArrays
@distinctUnionOfObjects
@distinctUnionOfSets
@max
@min
@sum
@unionOfArrays
@unionOfObjects
@unionOfSets
これらは NSSet と NSArray に適用できる演算子なので、”Set And Array” という枕詞がついて、”Set And Array Operators” という名前がついています。
例えば、次のような NSDictionary 型変数 company があるとします。
company = {
employees = (
{
age = 20;
name = A;
},
{
age = 23;
name = B;
},
{
age = 20;
name = C;
}
);
}
Set And Array Operators のひとつ @avg オペレータは、平均値を演算するためのオペレータですが、これを用いると age の平均値を次のようにして取得することができます。
NSNumber *averageOfAge; averageOfAge = [company valueForKeyPath:@"employees.@avg.age"];
上の例では、company 辞書から employees 配列を取得し、そこから @avg オペレータを使用して age の平均値を取得しています。結果は、(20 + 23 + 20) / 3 で 21 となります。
Set And Array Operators を使用するときのフォーマット
[obj valueForKeyPath:
@"keyPathToArrayOrSet.@operator.keyPathToProperty"];
age の平均値は、以下のようにしても取得することができます。
NSArray *employees; NSNumber *averageOfAge; employees = [company valueForKey:@"employees"]; averageOfAge = [employees valueForKeyPath:@"@avg.age"];
上の例では、@avg オペレータの適用されるものが既に employees 配列なので、@avg オペレータの前が空になっています。
また、age の平均値は、以下のようにしても取得することができます。
NSArray *ages; NSNumber *averageOfAge; ages = [company valueForKeyPath:@"employees.age"]; averageOfAge = [ages valueForKeyPath:@"@avg.self"];
上の例では、@avg オペレータの適用されるものが age の配列そのものなので、@avg オペレータの後が “self” になっています。
Set And Array Operators は、NSSet にも適用できます。
NSSet *employees; NSNumber *averageOfAge; employees = [NSSet setWithArray:[company valueForKey:@"employees"]]; averageOfAge = [employees valueForKeyPath:@"@avg.age"];
Set And Array Operators の概要は以上です。次回から、Set And Array Operator ひとつひとつを見ていきます。