Ich habe eine Methode I, die eine variable Anzahl von @selector()
Werte und gibt eine richtige NSString, die ich auf dieser Seite vor einer Weile gefunden. Dies ist nützlich, wenn ich Eigenschaftspfade für mich erstelle, weil mir die Idee, Strings dafür zu verwenden, nicht gefällt und ich die Idee mag, dass der Compiler die Werte überprüfen kann, aus denen der Pfad aufgebaut ist. Die Methode ist:Bulding-Eigenschaftspfade programmatisch mit den Selektoren einer anderen Klasse. Wie funktioniert das?
+(NSString *)keyPathFromSelectors:(SEL)firstArg, ...
{
NSMutableArray *keys = [NSMutableArray array];
va_list args;
va_start(args, firstArg);
for (SEL arg = firstArg; arg != nil; arg = va_arg(args, SEL))
{
[keys addObject:NSStringFromSelector(arg)];
}
va_end(args);
return [keys componentsJoinedByString:@"."];
}
Das funktioniert schön, aber die Frage ist: Warum? Wenn ich Eigentum auf meinem aktuellen Objekt mit dem Namen person
und es hat ein name
wäre der Weg person.name
offensichtlich sein und der Aufruf an meine Methode würde wie folgt aussehen:
+(NSSet *)keyPathsForValuesAffectingFoo
{
return [NSSet setWithObject:[self keyPathFromSelectors:@selector(person), @selector(name),nil]];
}
Die name
Selektor (sollte nicht) technisch sichtbar in meinem aktuelle Klasse, es ist in der Person
Klasse, auf die ich eine Referenz habe so wie ich auf das richtige name
SEL Objekt zugreifen?