长话短说:
我的一个同事请我帮忙。我是一个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;
}

如果要去掉成对的cellIdentifiercellClass参数,一个选项是在您使用的每个单元格类上创建defaultIdentifier类方法(static方法,用c话说)。这样,您可以只将类传递到factory方法中,factory方法可以查询类以获得适当的标识符。

关于c# - 将C#通用方法转换为Objective-C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16697759/

10-10 09:23