Отказ от цели C

Скажем, у меня есть подкласс NSManagedObject называется MBManagedSquare а также MBManagedCircle, MBManagedSquare а также MBManagedCircle определить метод prepareFromDictionary:(NSDictionary*)dicи обе их реализации разные.

Скажи, у меня есть этот код:

NSString *type = // could be @"MBManagedSquare" or @"MBManagedCircle"
NSEntityDescription *desc = [NSEntityDescription entityForName:type inManagedObjectContext:_context];
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:desc insertIntoManagedObjectContext:_context];

Таким образом, тип объекта, который будет с Core Data, определяется динамически через type строка. Так что все, что я знаю, это то, что это NSManagedObject,

Что я хочу сделать, это позвонить prepareFromDictionary: метод для правильного класса.

Так что если тип "MBManagedSquare", я хочу привести объект к MBManagedSquare, а затем позвоните

[castedObject prepareFromDictionary:dic];

То, что я пытался сделать, это:

Class class = NSClassFromString(type);
class *castedObject = (class*)object;

но я получаю ожидаемую ошибку выражения. Я не уверен, возможно ли это вообще. Как бы я это сделал?

2 ответа

Решение

Вам не нужно беспокоиться о вызове нужного класса, если селекторы и их параметры совпадают - ObjC обладает множеством возможностей динамической отправки.

Что касается реализации, то довольно часто

  • создать общую базу с интерфейсом, который вы хотите
  • или создайте протокол, который принимают оба класса:

MONProtocol.h

@protocol MONManagedShapeProtocol < NSObject >
- (void)prepareFromDictionary:(NSDictionary *)pDictionary;
@end

затем (поскольку вы знаете, что это один из двух типов, MBManagedSquare или же MBManagedCircle) либо наследовать от базы, либо принять протокол и объявить вашу переменную следующим образом:

// if subclass
MBManagedShape * castedObject = (MBManagedShape*)object;

или же

// if protocol
NSManagedObject<MONManagedShapeProtocol>* castedObject =
                        (NSManagedObject <MONManagedShapeProtocol>*)object;

Нет необходимости в гипсе там. объект может быть либо, либо и функция существует только один раз. проверка, если это там хорошо: RespondsToSelecctor:@selector(prepareFromDictionary:)

Другие вопросы по тегам