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

时间:2010-10-27 21:27:45

标签: ios objective-c

我有以下代码:

+ (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;
}

这会引发编译时错误。我是否必须求助于宏?有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果你把它投到UITableViewCell怎么办?

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

只要a_class继承UITableViewCell,就不会导致任何错误(编译或运行时)。

答案 1 :(得分:0)

即使有可能,你要做的事也没有任何意义。该演员阵容不会改变对象,原因有两个:

  1. cell只是该方法的一个参数。重新分配cell指向别的东西只会使论点指向另一个对象;它不会导致程序中的任何其他内容发生变化。特别是,cell最初指向的对象的其他引用将继续指向该原始对象,幸福地不知道该方法重新分配了它的参数。
  2. 将变量从ClassA *转换为ClassB *并不会神奇地使基础数据成为ClassB的实例 - 它只是让编译器知道变量指向的是什么类型的对象至。对象的类是对象本身的属性 - 这就是id类型可能的原因。