[E] Objective-C: Zugriff auf Klassenelemente - Key-Value Coding
-
2 Zugriff auf Klassenelemente
Vorwort
C++ ist nicht der einzige Ansatz gewesen, um der Sprache C die Möglichkeiten objektorientierter Programmierung einzuhauchen. Es gab die Entwicklung von Objective-C, die ebenfalls diese Möglichkeiten ergänzte, und gleichzeitig eine Kompatibilität zu C erhielt. Die Sprache war in der Breite wenig bekannt, da sie vor allem auf den Mac-Systemen zur Applikationsentwicklung benutzt wurde und wird. Durch den Boom von Mac, iPhone und wohl bald auch iPad wird die Sprache allerdings zusehends wichtiger werden, daher gibt es im Magazin nun eine einführende Artikelserie zu Objective-C (kurz: ObjC).
Dieser Artikel ist von http://www.cocoa-coding.de übernommen und behandelt wie Klassen und Objekte in Objective-C aufgebaut sind.
2.2 Key-Value Coding
Unter Key-Value Coding versteht man ein spezielles Verfahren, bei dem der Inhalt einer Variable über dessen Namen abrufen kann. Das ist nicht ungewöhnlich, werden Sie vielleicht denken, Variablen werden immer über den Variablennamen angesprochen. Aber haben Sie Geduld, es ist nicht so wie Sie vielleicht denken.
Die Anwendung in diesem Kapitel ist der Einfachheit halber wieder ein Foundation Tool. Gegeben sei die folgende Klasse:
person
.Datei: person.h
#import <Cocoa/Cocoa.h> @interface Person : NSObject { NSNumber *alter; NSString *name; NSString *vorname; } - (NSNumber *)alter; - (void)setAlter:(NSNumber *)value; - (NSString *)name; - (void)setName:(NSString *)value; - (NSString *)vorname; - (void)setVorname:(NSString *)value; @end
Datei: person.m
#import "Person.h" @implementation Person - (NSNumber *)alter { return[[alter retain] autorelease]; } - (void)setAlter:(NSNumber *)value { if(alter != value) { [alter release]; alter = [value copy]; } } - (NSString *)name { return[[name retain] autorelease]; } - (void)setName:(NSString *)value { if(name != value) { [name release]; name = [value copy]; } } - (NSString *)vorname { return[[vorname retain] autorelease]; } - (void)setVorname:(NSString *)value { if(vorname != value) { [vorname release]; vorname = [value copy]; } } @end
Das sind nur Accessor-Methoden und wenn Sie im letzten Kapitel gut aufgepasst haben, wissen Sie, dass sie diesen ganzen Code nicht von Hand schreiben müssen.
Erzeugen Sie nun in der
main
-Methode eine Instanz dieser Klassen, füllen Sie die Variablen mit Werten und geben Sie diese anschließend wieder aus.#import <Foundation/Foundation.h> #import "Person.h" intmain (intargc, const char* argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Person *myPerson = [[Person alloc] init]; [myPerson setAlter:[NSNumber numberWithInt:32] ]; [myPerson setName:@"Müller"]; [myPerson setVorname:@"Max"]; NSLog(@"Name: %@",[myPerson name]); NSLog(@"Alter: %@",[myPerson alter]); NSLog(@"Vorname : %@",[myPerson vorname]); [myPerson release]; [pool drain]; return 0;
Das sollte für Sie inzwischen nichts Neues mehr sein und das Ergebnis auch nicht unerwartet.
Wie Anfangs angekündigt wollen wir den Inhalt einer Variablen über dessen Namen abrufen. Ändern Sie deshalb die Zeile
NSLog(@"Name: %@",[myPerson name]);
in
NSLog(@"Name: %@",[myPerson valueForKey:@"name"]);
Das sieht auf den ersten Blick nur nach einer alternativen Schreibweise aus, aber vielleicht ahnen Sie wie es weiter geht. Die Variable wird hier über einen
NSString
abgefragt, und so ein String kann wiederum eine Variable sein.NSString *wert = @"name"; NSLog(@"Name: %@",[myPerson valueForKey:wert]);
Nun wird das ganze hoffentlich klarer, ein
NSString
, der Variablennamen zum Inhalt hat, führt zur Ausgabe des Variableninhaltes. Genau dies tutvalueForKey
. Dabei musswert
nicht zwangsläufig im Code festgelegt werden, es könnte eben so gut eine Eingabe eines Benutzers sein.Es ist natürlich fatal einen Key abzufragen, der in der Klasse nicht vorhanden ist. Dieses wird das Programm zum Absturz bringen und kein noch so guter Compiler wird Sie davor warnen können, wenn der Key erst zur Laufzeit festgelegt wird. Vorsicht ist also angebracht.
Natürlich kann durch Key-Value Coding auch ein Wert gesetzt werden.
NSString *wert = @"name"; NSLog(@"Name: %@",[myPerson valueForKey:wert]);
Key-Value Coding ist übrigens sehr praktisch bei der Verwendung von AppleScript und nahezu unverzichtbar bei der Anwendung von Databinding.