Как я могу передать имя класса как аргумент объектной фабрике в какао?

$ newtime = date ("H: i: s", strtotime ($ this-> time)); попробуй вот так

15
задан e.James 25 November 2008 в 04:04
поделиться

4 ответа

Можно преобразовать строку в класс с помощью функции: NSClassFromString

Class classFromString = NSClassFromString(@"MyClass");

В Вашем случае, хотя, Вы были бы более обеспеченным использованием Объектов класса непосредственно.

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

- (id)makeObjectOfClass:(Class)aClass
{
    assert([aClass instancesRespondToSelector:@selector(reset)]);
    id newInstance = [aClass createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}
22
ответ дан 1 December 2019 в 01:31
поделиться

Довольно легко динамично указать класс, на самом деле можно просто сослаться на него, он - имя:

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

Еще одна подсказка, я избегал бы использования номенклатуры 'управляемый объект', так как большинство других программистов Cocoa считает что как NSManagedObject от Базовых Данных. Можно также найти легче использовать глобальный NSNotification (который все способные сбросом объекты подписывают на) вместо того, чтобы управлять набором различных типов объектов, но Вам больше сообщают для принятия того решения, чем я.

3
ответ дан 1 December 2019 в 01:31
поделиться

Бит ответа, отсутствующего в других ответах, - то, что Вы могли определить a @protocol содержа Ваш +createInstance и +reset методы.

3
ответ дан 1 December 2019 в 01:31
поделиться

Это кажется на желание чего-то как:

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

Это приняло бы названный метод класса +createInstance. Или Вы могли просто использовать [[klass alloc] init].

Назвать его:

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

В зависимости от того, что Вы пытаетесь сделать, могло бы быть лучше раздать объекты класса, чем строки, например:

MyClass *variable = [factory makeObjectOfClass:[MyClass class]];
2
ответ дан 1 December 2019 в 01:31
поделиться