从返回Class的函数动态类型转换

时间:2014-07-17 13:24:21

标签: objective-c

    - (void)activate:(NSDictionary *)options {
      Class c = [self displayClass];
      self.display = [[c alloc] initWithOptions:options];
      (c *)self.display.delegate = self;

我的显示属性是基本的显示类。

最后一行出错。有问题的委托只适用于当前的displayClass,它是Display的子类。

如何投射以设置委托?

编辑:

我明白(显示*)有效。我试图使((显示*)部分动态。当我做(c *)self.display).delegate = self;我得到了#34;预期的表达"。

2 个答案:

答案 0 :(得分:1)

听起来你在这里假设了几种自定义方法(initWithOptionsdelegate)。如果不先检查这些方法是否存在,则调用它们可能不安全。我建议在启动显示对象之前创建一个协议并检查你的类是否符合它。

@protocol MYDisplay //use whatever prefix you want here

@property (readwrite, weak) id<MYDisplayDelegate> delegate;
- (id) initWithOptions:(NSDictionary*)options;

@end

然后,在您的activate方法中,检查这是否是要使用的有效类并转换为该协议的实例。

- (void)activate:(NSDictionary *)options 
{
      Class c = [self displayClass];
      if ([c conformsToProtocol:@protocol(MYDisplay)])
      {
          id<MYDisplay> display = [[c alloc] initWithOptions:options];
          display.delegate = self;
          self.display = display;
      }
      else
      {
          NSLog("Can't create a display from class %@", NSStringFromClass(c));
      }
}

然后,每个Display类都需要采用此协议。

@class SomeConcreteDisplayClass : NSObject <MYDisplay>

@property (readwrite, weak) delegate;
- (id) initWithOptions:(NSDictionary*)options;

...

@end

如果您要混合并匹配自己的自定义类和框架类以用作Display对象,也可以extend UIKit classes使它们符合此协议

你可以查看很多关于NSObject和类的类似内容。请查看NSObject class reference中的“获取方法信息”。

答案 1 :(得分:0)

我假设您的超类名称是Display。请尝试以下代码。

- (void)activate:(NSDictionary *)options {
      Class c = [self displayClass];
      self.display = [[c alloc] initWithOptions:options];
      ((Display *)self.display).delegate = self;
}
相关问题