Frage

Ich versuche, eine Bibliothek zu schreiben, so dass es allgemein genug, dass seine nützlich ist. Das Problem ist, dass es braucht Eigenschaften anderer Klassen zu aktualisieren, die Eigenschaft und Klasse sollten dynamisch sein.

Jetzt kann ich es öffentliche Variablen kein Problem mit, gebe ich nur einen Zeiger auf die Variable I aktualisieren möchten. Allerdings wäre es auch unglaublich nützlich sein, Eigenschaften von Klassen zu setzen, wie gut, da sie so großzügig in Objective-C verwendet werden.

Nun wieder ist dies kein Problem, solange das Eigentum ist ein Objekttyp, versuchte Urtyp Eigenschaften zu setzen.

Mein aktueller Code sieht etwas in diese Richtung für Eigenschaften:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[[myInstance class] instanceMethodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
[invoc setArgument:&myObject atIndex:2];
[invoc invoke];

Doch die setArgument Methode erlaubt nur für Zeigertypen, noch Eigenschaften sind jede primitive Art zu haben, erlaubt. Gibt es eine Möglichkeit zum dynamischen Urtyp Eigenschaften zuweisen?

War es hilfreich?

Lösung

KVO sollte die Konvertierung für Sie tun:

[object setValue:[NSNumber numberWithInt:i] forKey:@"myVar"];

wird die NSNumber in einen int umwandeln, wenn Ihr myVar ist wie folgt definiert:

int myVar;
...
@propery (nonatomic) int myVar;

Andere Tipps

„Doch die setArgument Methode erlaubt nur für Zeigertypen“ Du bist etwas fehlt. Das Argument setArgument: ist nicht die Daten, die Sie an die Methode übergeben. Es ist die Adresse der Daten (von was Typ) Sie sind vorbei. Gerade jetzt Ihr Code oben nimmt die Adresse eines Objekt Zeiger (es ist ein Zeiger auf einen Zeiger). Sie können genauso gut sie die Adresse einer ganzen Zahl dauern (es kümmert sich nicht darum). Mit anderen Worten, Ihr gleicher bereits genauer Code funktioniert unabhängig vom Typ:

NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:[myInstance methodSignatureForSelector:mySelector]];
[invoc setTarget:myInstance];
[invoc setSelector:mySelector];
int myInt = 42;
[invoc setArgument:&myInt atIndex:2];
[invoc invoke];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top