Отказ от цели 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:)