1

假设我有一个NSManagedObject名为MBManagedSquareand的子类MBManagedCircle。一个MBManagedSquareMBManagedCircle定义一个方法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;

但我得到一个预期的表达式错误。我不确定这是否可能。我该怎么做?

4

2 回答 2

2

如果选择器及其参数匹配,您无需担心调用正确的类——ObjC 具有大量动态调度功能。

就实现而言,这两种方法都很常见:

  • 使用您想要的界面创建一个公共基础
  • 或创建两个类都采用的协议:

MON协议.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;
于 2012-11-12T06:51:49.433 回答
0

那里不需要演员表。对象可以是 or 并且函数只存在一次。检查它是否存在:responsToSelector:@selector(prepareFromDictionary:)

于 2012-11-12T07:01:14.157 回答