在运行时将对象转换为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吗? 有一个更好的方法吗?
即使有可能,你要做什么也没有任何意义。 该表格不会更改对象,原因有两个:
-
cell
只是该方法的一个参数。 重新分配cell
指向别的东西只是使参数指向不同的对象; 它不会导致程序中的其他任何内容改变。 特别是,对cell
最初指向的对象的其他引用将继续指向该原始对象,而不会意识到该方法将重新分配其参数。 - 将
ClassA *
的variables转换为ClassB *
不会使基础数据成为ClassB
的实例 – 它只是让编译器知道variables指向哪种对象。 该对象的类是对象本身的一个属性 – 这就是为什么id
types是可能的。
如果你只是把它投到UITableViewCell
?
for (id currentObject in topLevelObjects) { if ([currentObject isKindOfClass: [UITableViewCell class]]) { cell = (UITableViewCell *) currentObject; break; } }
只要a_class
inheritanceUITableViewCell
不会导致任何错误(编译或运行时)。