长话短说:
我的一个同事请我帮忙。我是一个C开发人员,他是一个IOS开发人员,每次阅读其他代码给我们一些好的洞察力。
他正在编写一个函数,需要返回一个basetypeUITableViewCell
的对象,并有一个整数作为输入。实际返回类型是UITableViewCell
的子类。他问我是否知道一个更好的解决方案,然后像这样简单的切换:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (row) {
case 0: {
NSString *CellIdentifier = @"personCell";
PersonInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[PersonInfoCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
break;
}
case 1: {
NSString *CellIdentifier = @"photoCell";
PhotoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[PhotoCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
break;
}
default:
return nil; //Don't care about this atm. Not the problem.
break;
}
}
我的C语言实现将是如下内容:
public UITableViewCell TableViewCellForRowAtIndexPath(UITableView tableView, NSIndexPath indexPath)
{
switch(indexPath.row)
{
case 0:
return MakeCell<PersonInfoCell>();
case 1:
return MakeCell<PhotoCell>();
default:
return null; //Still doesn't matter
}
}
public TCell MakeCell<TCell>() where TCell : UITableViewCell, new()
{
TCell cell = new TCell();
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
public class PersonInfoCell : UITableViewCell
{
//Dont care about implementation yet....
//TL;DR
}
public class PhotoCell : UITableViewCell
{
//Dont care about implementation yet....
//TL;DR
}
短篇故事:
有没有人知道一种方法来把我的C语言泛型代码转换成C语言?
更新1
基于Nicholas Carey思想的错误实现。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ switch (row) { case 0: { NSString *CellIdentifier = @"personCell"; PersonInfoCell *cell = (PersonInfoCell *)[self makeCell:CellIdentifier]; //Do PersonInfoCell specific stuff with cell return cell; break; } case 1: { NSString *CellIdentifier = @"photoCell"; PhotoCell *cell = (PhotoCell *)[self makeCell:CellIdentifier]; //Do PhotoCell specific stuff with cell return cell; break; } default: return nil; //Don't care about this atm. Not the problem. break; }}- (id *)makeCell:(NSString *)cellIdentifier{ id cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[PhotoCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; // <---- how does this method know it is a PhotoCell I want? //PhotoCell??? } cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell;}
最佳答案
在objective-c中,类是第一类构造,它可以像任何其他对象一样被传递和使用。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellIdentifier = nil;
Class cellClass = nil;
switch (row) {
case 0:
cellIdentifier = @"personCell";
cellClass = [PersonInfoCell class];
break;
case 1:
cellIdentifier = @"photoCell";
cellClass = [PhotoCell class];
break;
default:
return nil; //Don't care about this atm. Not the problem.
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[cellClass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
如果您真的想排除工厂方法,可以这样做:
- (UITableViewCell *)getOrCreateCellForTable:(UITableView *)tableView withIdentifier:(NSString *)cellIdentifier class:(Class)cellClass
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[cellClass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
如果要去掉成对的
cellIdentifier
和cellClass
参数,一个选项是在您使用的每个单元格类上创建defaultIdentifier
类方法(static
方法,用c话说)。这样,您可以只将类传递到factory方法中,factory方法可以查询类以获得适当的标识符。关于c# - 将C#通用方法转换为Objective-C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16697759/