在运行时将对象转换为dynamictypes

我有以下代码:

+ (UITableViewCell *) createTableViewCell: (NSString *) cell_id withTableView: tableView { SomeViewClass *cell = (SomeViewClass *)[tableView dequeueReusableCellWithIdentifier: cell_id]; if (cell == nil) { NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed: @"AViewCell" owner: nil options: nil]; for (id currentObject in topLevelObjects) { if ([currentObject isKindOfClass: [UITableViewCell class]]) { cell = (SomeViewClass *) currentObject; break; } } } return cell; } 

我想抽象的代码,以便它可以用于任何视图类,而不只是一个“SomeViewClass”。 我想将其转换成如下所示的内容。 注意下面的dynamictypes(一个类*)的转换。

 + (UITableViewCell *) createTableViewCell: (NSString *) cell_id withTableView: tableView withClass: (Class) a_class { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cell_id]; if (cell == nil) { NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed: @"AViewCell" owner: nil options: nil]; for (id currentObject in topLevelObjects) { if ([currentObject isKindOfClass: [UITableViewCell class]]) { cell = (a_class *) currentObject; break; } } } return cell; } 

这会引起编译时错误。 我必须诉诸macros吗? 有一个更好的方法吗?

即使有可能,你要做什么也没有任何意义。 该表格不会更改对象,原因有两个:

  1. cell只是该方法的一个参数。 重新分配cell指向别的东西只是使参数指向不同的对象; 它不会导致程序中的其他任何内容改变。 特别是,对cell最初指向的对象的其他引用将继续指向该原始对象,而不会意识到该方法将重新分配其参数。
  2. ClassA *的variables转换为ClassB *不会使基础数据成为ClassB的实例 – 它只是让编译器知道variables指向哪种对象。 该对象的类是对象本身的一个属性 – 这就是为什么idtypes是可能的。

如果你只是把它投到UITableViewCell

 for (id currentObject in topLevelObjects) { if ([currentObject isKindOfClass: [UITableViewCell class]]) { cell = (UITableViewCell *) currentObject; break; } } 

只要a_classinheritanceUITableViewCell不会导致任何错误(编译或运行时)。