在运行时将对象转换为动态类型

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 类型是可能的。

【讨论】:

以上是关于在运行时将对象转换为动态类型的主要内容,如果未能解决你的问题,请参考以下文章

在运行时将类型 id 的对象转换为未知类型

C# 在运行时将 Enumerable.Iterator 强制转换为已知 List<Object>

将 JSON 对象脱盐到数据表时将值“1D”转换为类型“System.Int64”时出错

面向对象----多态类型的转换

只有一个对象时将 XML 转换为 Json 数组

Java 脚本化编程指南