353

objectForKeyとはどう違いvalueForKeyますか?ドキュメントで両方を調べたところ、同じように見えました。

4

6 に答える 6

406

objectForKey:NSDictionary方法です。NSDictionaryは に似たコレクション クラスですが、インデックスNSArrayを使用する代わりにキーを使用してアイテムを区別します。キーは、ユーザーが提供する任意の文字列です。2 つのオブジェクトが同じキーを持つことはできません (1 つの 2 つのオブジェクトがNSArray同じインデックスを持つことができないのと同じように)。

valueForKey:KVC方式です。これは、任意のクラスで動作します。valueForKey:名前に文字列を使用してプロパティにアクセスできます。たとえば、Accountプロパティを持つクラスがある場合accountNumber、次のことができます。

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setAccountNumber:anAccountNUmber];

NSNumber *anotherAccountNumber = [newAccount accountNumber];

KVC を使用して、プロパティに動的にアクセスできます。

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setValue:anAccountNumber forKey:@"accountNumber"];

NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];

これらは同等のステートメントのセットです。

私はあなたが考えていることを知っています:うわー、しかし皮肉なことに。KVC はあまり役に立たないようです。実際、それは「言葉遣い」に見えます。しかし、実行時に変更したい場合は、他の言語でははるかに難しい多くのクールなことを行うことができます (ただし、これは質問の範囲を超えています)。

KVC について詳しく知りたい場合は、特にScott Stevenson のブログで Google を検索すると、多くのチュートリアルがあります。NSKeyValueCoding プロトコル リファレンスも参照してください。

それが役立つことを願っています。

于 2009-06-30T09:02:14.087 に答える
20

objectForKey:代わりに可能な限り使用する大きな理由がありますvalueForKey:-不明なキーを使用すると、 「このクラスはキーのキー値コーディングに準拠していません」valueForKey:とスローされます。NSUnknownKeyException

于 2013-12-30T19:19:26.773 に答える
1

この表は、 と の 4 つの相違点を表しobjectForKeyていvalueForKeyます。

//   |---------------------|-------------------------|------------------------|
//   |                     |      `objectForKey`     |      `valueForKey`     |
//   |---------------------|-------------------------|------------------------|
//   | Works on ...        |       NSDictionary      |   NSDictionary / KVC   |
//   |---------------------|-------------------------|------------------------|
//   | Throws exception    |            No           |       Yes (on KVC)     |
//   |---------------------|-------------------------|------------------------|
//   | Feed                |   NSObject's subclass   |        NSString        |
//   |---------------------|-------------------------|------------------------|
//   | Usage on KVC        |          cannot         |           can          |
//   |---------------------|-------------------------|------------------------|
于 2021-07-06T06:12:03.320 に答える