Frage

Ich arbeite an einem Objekt Fabrik Spur einer kleinen Sammlung von Objekten zu halten. Die Objekte können unterschiedlicher Art sein, aber sie werden alle auf createInstance und reset reagieren. Die Objekte können nicht von einer gemeinsamen Basisklasse abgeleitet werden, da einige von ihnen haben aus dem eingebauten in Kakao-Klassen wie NSView und NSWindowController abzuleiten.

Ich möchte in der Lage sein, Fälle von jedem geeigneten Objekt zu erstellen, indem Sie einfach die gewünschten Klassennamen zu meiner Fabrik vorbei wie folge:

myClass * variable = [factory makeObjectOfClass:myClass];

Die makeObjectOfClass: Methode wie folgt aussehen würde:

- (id)makeObjectOfClass:(CLASSNAME)className
{
    assert([className instancesRespondToSelector:@selector(reset)]);
    id newInstance = [className createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

Gibt es eine Möglichkeit, einen Klassennamen zu einer Methode zu übergeben, wie ich mit dem Argumente (CLASSNAME)className getan habe oben makeObjectOfClass:?

Aus Gründen der Vollständigkeit, hier ist, warum ich alle Objekte verwalten möchten. Ich möchte in der Lage, den kompletten Satz von Objekten in einem Schuss zurückgesetzt werden, indem [factory reset]; aufrufen.

- (void)reset
{
    [managedObjects makeObjectsPerformSelector:@selector(reset)];
}
War es hilfreich?

Lösung

Sie können einen String in eine Klasse konvertieren mit der Funktion: NSClassFromString

Class classFromString = NSClassFromString(@"MyClass");

In Ihrem Fall aber würden Sie direkt die Klasse Objekte mit besser dran.

MyClass * variable = [factory makeObjectOfClass:[MyClass class]];

- (id)makeObjectOfClass:(Class)aClass
{
    assert([aClass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [aClass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

Andere Tipps

Ich habe Recht, eine bessere Anleitung, das bitte Kasse https://appengineer.in/ 2014/03/13 / send-class-name-as-a-Argument-in-ios /

Es ist ziemlich einfach, um dynamisch eine Klasse angeben, in der Tat kann man es nur verweisen, indem sie den Namen:

id string = [[NSClassFromString(@"NSString") alloc] initWithString:@"Hello!"];
NSLog( @"%@", string );

Eine andere Spitze, würde ich mit der Nomenklatur ‚verwaltete Objekt‘ vermeiden, da die meisten anderen Cocoa-Programmierer, dass als NSManagedObject, von Core Data lesen. Sie können es auch einfacher finden eine globale NSNotification zu verwenden (das alle Ihre Reset-able Objekte abonnieren) stattdessen eine Sammlung von verschiedenen Arten von Objekten zu verwalten, aber Sie sind besser informiert, diese Entscheidung zu machen, als ich bin.

Das Bit der Antwort von den anderen Antworten fehlt, ist, dass Sie eine @protocol definieren könnten Ihre +createInstance und +reset Methoden enthalten.

Es klingt wie Sie wollen so etwas wie:

- (id)makeObjectOfClassNamed:(NSString *)className
{
    Class klass = NSClassFromString(className);
    assert([klass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [klass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}

Dies würde eine Klassenmethode namens +createInstance annehmen. Oder Sie könnten nur [[klass alloc] init] verwenden.

nennen:

MyClass *variable = [factory makeObjectOfClassNamed:@"MyClass"];

Je nachdem, was Sie versuchen zu tun, könnte es besser sein, zu laufen um Klassenobjekte als Zeichenfolgen, z.

MyClass *variable = [factory makeObjectOfClass:[MyClass class]];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top