objectForKey
とvalueForKey
の違いは何ですか? 私は両方のドキュメントを見て、彼らは私と同じように見えました。objectForKeyとvalueForKeyの違いは?
答えて
objectForKey:
は、NSDictionary
の方法である。 NSDictionary
は、インデックスを使用する代わりに、キーを使用して項目を区別する点を除いて、NSArray
と同様のコレクションクラスです。キーとは、あなたが提供する任意の文字列です。 2つのオブジェクトが同じキーを持つことはできません(NSArray
内の2つのオブジェクトが同じインデックスを持つことはできません)。
valueForKey:
は、KVC法です。これはANYクラスで動作します。 valueForKey:
では、名前に文字列を使用してプロパティにアクセスできます。私はプロパティaccountNumber
でAccount
クラスを持っているのであれば、たとえば、私が行うことができ、次のものが同等のセットです
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
:KVCを使用して
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
が、私は動的プロパティにアクセスすることができますステートメント。
私はあなたが思っていることを知っています:うわー、しかし皮肉です。 KVCはそれほど役に立たないとは思わない。実際、それは "言葉"に見えます。しかし、実行時に変更する場合は、他の言語でははるかに難しいクールなものをたくさんすることができます(しかし、これはあなたの質問の範囲外です)。
KVCの詳細については、Scott Stevenson's blogのGoogleの場合は多くのチュートリアルがあります。 NSKeyValueCoding Protocol Referenceもご覧ください。
希望に役立ちます。ここで
valueForKey:
を実行するときには、それにNSStringを渡す必要がありますが、objectForKey:
は任意のNSObjectサブクラスをキーとすることができます。これは、Key-Value Codingの場合、キーは常に文字列であるためです。
は実際には、ドキュメントは、あなたがvalueForKey:
NSStringのを与える場合でも、文字列は、@
から始まるその場合には、例外を発生させることがvalueForUndefinedKey:
を呼ぶ可能性がある、[super valueForKey:]
を呼び出していない限り、それはとにかくobjectForKey:
を起動すると述べています。
あなたは私にあなたが意味するドキュメンテーションのリンクを教えてください。ありがとうございました。 –
@ [ここにある](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html#//apple_ref/doc/uid/ 20000140-BBCIBCDJ) – dreamlax
はobjectForKey:
可能な限りの代わりvalueForKey:
使用する大きな理由だ - 不明なキーでvalueForKey:
を「このクラスは、キー値コーディング準拠のキーのためではありません」と言ってNSUnknownKeyException
がスローされます。
を参照してください。「valueForKey:未知のキーがあると、NSUnknownKeyExceptionがスローされます。「このクラスはキーに対応するキー値ではありません」 – onmyway133
このように、objectForKey:
データ型は:(id)aKey
であり、valueForKey:
データ型は:(NSString *)key
です。例えば
:objectForKey:
オブジェクトの任意の型を取る一方
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];
NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);
//This will work fine and prints ( 123 )
NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]);
//it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime.
したがって、valueForKey:
は、唯一の文字列値を取り、KVC方法であるだろう。
objectForKey
の値は、同じ種類のオブジェクトによってアクセスされます。
valueForKeyは、キーが@記号で始まるかどうかによってNSDictionaryオブジェクトの動作が異なります。 – dreamlax
objectForKey:文字列だけでなく、オブジェクトをキーとして受け入れます。唯一の要件は、鍵がNSCopyingプロトコルをサポートしていることです。 –
これらの点はどちらも当てはまります。 NSDictionariesは特殊なケースであり、キーに文字列を使用する必要はありません。私は実際にどちらかの微妙なことには行きませんでした。なぜなら、質問者は単純な比較を必要としたように思えるからです。 –