objectForKey
とはどう違いvalueForKey
ますか?ドキュメントで両方を調べたところ、同じように見えました。
6 に答える
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 プロトコル リファレンスも参照してください。
それが役立つことを願っています。
objectForKey:
代わりに可能な限り使用する大きな理由がありますvalueForKey:
-不明なキーを使用すると、 「このクラスはキーのキー値コーディングに準拠していません」valueForKey:
とスローされます。NSUnknownKeyException
この表は、 と の 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 |
// |---------------------|-------------------------|------------------------|