我有以下代码:
+ (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;
}
这会引发编译时错误。我是否必须求助于宏?有更好的方法吗?
答案 0 :(得分:1)
如果你把它投到UITableViewCell
怎么办?
for (id currentObject in topLevelObjects) {
if ([currentObject isKindOfClass: [UITableViewCell class]]) {
cell = (UITableViewCell *) currentObject;
break;
}
}
只要a_class
继承UITableViewCell
,就不会导致任何错误(编译或运行时)。
答案 1 :(得分:0)
即使有可能,你要做的事也没有任何意义。该演员阵容不会改变对象,原因有两个:
cell
只是该方法的一个参数。重新分配cell
指向别的东西只会使论点指向另一个对象;它不会导致程序中的任何其他内容发生变化。特别是,cell
最初指向的对象的其他引用将继续指向该原始对象,幸福地不知道该方法重新分配了它的参数。ClassA *
转换为ClassB *
并不会神奇地使基础数据成为ClassB
的实例 - 它只是让编译器知道变量指向的是什么类型的对象至。对象的类是对象本身的属性 - 这就是id
类型可能的原因。