在运行时将对象转换为动态类型
Posted
技术标签:
【中文标题】在运行时将对象转换为动态类型【英文标题】:Casting of objects to dynamic types at runtime 【发布时间】:2010-10-27 21:27:44 【问题描述】:我有以下代码:
+ (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”。我想把它变成如下的东西。请注意下面动态类型(类 *)的转换。
+ (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;
这会引发编译时错误。我必须求助于宏吗?有没有更好的方法来做到这一点?
【问题讨论】:
【参考方案1】:如果您只是将其转换为 UITableViewCell
会怎样?
for (id currentObject in topLevelObjects)
if ([currentObject isKindOfClass: [UITableViewCell class]])
cell = (UITableViewCell *) currentObject;
break;
只要a_class
继承UITableViewCell
,就不会导致任何错误(编译或运行时)。
【讨论】:
【参考方案2】:即使有可能,您尝试做的事情也毫无意义。该演员表不会改变对象,原因有两个:
cell
只是该方法的一个参数。重新分配cell
以指向其他对象只会使参数指向不同的对象;它不会导致程序中的任何其他内容发生变化。特别是,cell
最初指向的对象的其他引用将继续指向该原始对象,完全没有意识到该方法重新分配了它的参数。
将变量从ClassA *
转换为ClassB *
不会神奇地使基础数据成为ClassB
的实例——它只是让编译器知道变量指向的对象类型。对象的类是对象本身的一个属性——这就是为什么id
类型是可能的。
【讨论】:
以上是关于在运行时将对象转换为动态类型的主要内容,如果未能解决你的问题,请参考以下文章
C# 在运行时将 Enumerable.Iterator 强制转换为已知 List<Object>