Skip to content

KVC に於ける NSDictionary の特別な挙動

2010.09.21

KVC (Key-Value Coding) に於ける NSDictionary の挙動は特殊なものとなっています。これを把握しておくと、NSPredicate でできることの幅が増えたり、Cocoa Bindings でできることの幅が増えるなどの利点があります。

今回は、KVC に於ける NSDictionary の挙動を確認します。


NSDictionary の valueForKey: メソッドは、NSObject のそれとは少し違う挙動をとります。

[dict valueForKey:key];

普通、valueForKey: メソッドは、渡された key に対応するオブジェクトをレシーバから探します。「dict が -get<Key> というメソッドを実装していれば、そのメソッドが返すオブジェクトを返す」「-<key> というメソッドを実装していれば、そのメソッドが返すオブジェクトを返す」‥‥という探索が始まります。この探索について詳細は Accessor Search Implementation Details を参照。

NSDictionary は、これとは異なり、key を引数に -objectForKey: メソッドを呼びます。

NSDictionary *dict;
id count;
dict = [NSDictionary dictionaryWithObject:@"Hello" forKey:@"count"];
count = [dict valueForKey:@"count"];
NSLog(@"count = %@", count);
// count = Hello

NSDictionary に普段通りの挙動をしてもらいたいときは、key の頭に “@” を付けます。こうすることで [super valueForKey:key] が呼ばれ、普段通りの挙動になります。

NSDictionary *dict;
id count;
dict = [NSDictionary dictionaryWithObject:@"Hello" forKey:@"count"];
count = [dict valueForKey:@"@count"];
NSLog(@"count = %@", count);
// count = 1

次回は、KVC に於ける NSSet と NSArray の特別な挙動を取り上げます。

Advertisements

From → Develop

Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s