自分自身に答えてください。
キーが始まらない場合は、次の辞書のvalueForKey:
は、辞書はキーがない場合は、アップルのドキュメントが言うように、それは、NSObject
がそうであるようにアクセサメソッドを呼び出してnilを返し、ないだろう、デフォルトの動作を上書き"@"は、objectForKey:を呼び出します。キーに が「@」で始まる場合は、「@」を取り除き、 のキーで[super valueForKey:]を呼び出します。
NSDictionary
はクラスタクラスなので、動作を上書きするためにサブクラス化することはお勧めしません。代わりに、私はこのようなスイスのメソッドを使用します。NSArrayのはvalueForKey:@"toMyObject"
をコールするため
@implementation NSDictionary (MyAddition)
static void swizzle(Class c, SEL orig, SEL new)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
+ (void)initialize
{
if (self == [NSDictionary class]){
swizzle([NSDictionary class],
@selector(valueForKey:),
@selector(myValueForKey:));
}
}
- (id)toMyObject
{
return toMyObject;
}
...
- (id)myValueForKey:(NSString *)key
{
// for collection operators
if ([key compare:@"@" options:0 range:NSMakeRange(0, 1)] == NSOrderedSame)
return [super valueForKey:key];
if ([key isEqualToString:@"toMyObject"])
return [self toMyObject];
return [self myValueForKey:key];
}
は、今では安全です。
出典
2012-02-05 04:07:43
cxa
こんにちはディートリッヒ、 'NSArray'の' valueForKey: '各項目ごとに呼び出され、アイテムの' valueForKeyの結果を含む新しい配列を返します。 ' 。あなたはXcodeを開いてこれを試すことができます: 'NSArray * array = [NSArray arrayWithObjects:@" foo "、@" bar "、@" baz "、nil]; NSArray * capitals = [配列valueForKey:@ "capitalizedString"]; ' – cxa
ここにdoc:https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArrayがあります。 .html#// apple_ref/doc/uid/20000137-BBCIBCDJ – vikingosegundo
私は財団の変更に注意を払っていないようです。 –