[myObject setValue:foo forKey:@"bar"]
リテラルを使用して手で書き出すことは、ほとんど決して好ましいことではありません@"bar"
。実行時までアクセスしたいプロパティがわからない場合、通常は KVC を使用してプロパティにアクセスします。
1 つの例は、xib のアウトレットです。テキスト フィールドのデリゲート アウトレットを xib のファイルの所有者に接続すると、xib は接続を 3 つのフィールドを持つオブジェクトとして記録します。
- テキストフィールドへの参照 (アウトレットを持つオブジェクト)
- ファイルの所有者のプレースホルダー (接続先) への参照
- 文字列としてのアウトレットの名前、
@"delegate"
実行時に、xib ローダー (UIKit フレームワークの一部) はテキスト フィールドを逆シリアル化します。次に、接続オブジェクトを逆シリアル化し、それを使用して、xib で配線した接続を確立します。xib ローダーは、テキスト フィールドのプロパティ (delegate
プロパティ) を設定する必要がありますが、アプリと UIKit フレームワークの両方がコンパイルされてからずっと後の実行時に xib をロードするまで、どのプロパティかはわかりません。
実行時までアクセスするプロパティがわからない別の例は、CALayer
サブクラスのカスタム プロパティをアニメーション化する Core Animation の (ほとんど知られていない) 機能です。という名前のプロパティを持つ、CALayer
calledのサブクラスを作成するとします。標準を使用してプロパティをアニメーション化できます。PolygonLayer
sides
sides
CABasicAnimation
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sides"];
animation.fromValue = @3;
animation.toValue = @9;
animation.autoreverses = YES;
animation.duration = 1;
[myPolygonLayer addAnimation:animation forKey:@"sides"];
sides
Presto、Core Animation は、レイヤーのプロパティを 3 から 9 へとアニメーション化します。sides
しかし、Core Animation のソース コードは、プロパティについて何も知りません。(詳細については、この質問を確認してください。)
コンパイル時にプロパティを知っていても、KVC を使用することがあります。1 つの例は、KVC が行ってくれる余分な作業を利用したい場合です。たとえば、NSArray
たくさんのPerson
オブジェクトがあり、すべての人物の名の配列を取得したい場合、次のように記述できます。
NSMutableArray *firstNames = [NSMutableArray array];
for (Person *person in people) {
[firstNames addObject:person.firstName];
}
しかし、これは KVC がよりシンプルにする機能を備えている場合です。KVC を使用して配列のプロパティにアクセスすると、KVC は実際には配列内のすべての要素のそのプロパティにアクセスします。
NSArray *firstNames = [people valueForKey:@"firstName"];
コンパイル時にプロパティがわかっている場合でも KVC を使用する可能性がある別の例は、プロパティがクラスの一部として静的に宣言されていない場合です。たとえば、各 NSManagedObject (コア データの一部) は、そのインスタンスNSManagedObject
が表しているエンティティに基づいて、自身に動的にプロパティを与えます。KVC を使用してこれらのプロパティにアクセスできますが、通常はのサブクラスNSManagedObject
または のカテゴリでNSManagedObject
宣言することをお勧めします。