如何在 swift 中使 Base class 属性 通用以便可以与多种模型类型一起使用?

How to make Base class property generic in swift so can use with multiple model type?

我希望 属性“cellViewModel”是通用的,这样我就可以对不同类型的模型重用 BaseCustomCell。 例如

 struct CELLVIEWMODEL {
   var name: String
   var address: String
 }
 class BaseCustomCell: UITableViewCell {
       var cellViewModel: CELLVIEWMODEL  //should support different model types CELLVIEWMODEL1,CELLVIEWMODEL2
       {
        didSet() {
          setValuesInSubClasses
        }
      }
      func setValuesInSubClasses() {
       //subclass will implement
      }
 }

 class subCell: BaseCustomCell {
     override func setValuesInSubClasses() {
       //set value from cellViewModel
      }
 }

//这就是我从 cellForRowAtIndexPath 方法设置的方式:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: viewModel.getCellId(), for: indexPath) as! BaseCustomCell
        cell.cellViewModel = viewModel.getCellModelAtIndexPath(indexPath) //this will set values for subclasses
        return cell
    }

现在,我每次都为不同类型的 cellViewModel 创建新的 BaseCustomCell。你能帮忙解决一下吗?

有多种方法可以实现您的目标。

您可以使实际的 BaseCustomCell 玻璃通用,但请注意,如果您使用情节提要,这不是解决方案,因为您需要将通用类型硬编码到情节提要中。

另一个适用于故事板的解决方案是将您的视图模型声明为协议,然后您可以将其替换为协议的任何具体实现。

protocol CellViewModel {
    var name: String { get }
    var address: String { get }
}

class BaseCustomCell: UITableViewCell {
    var cellViewModel: CellViewModel {
        didSet() {
            setValuesInSubClasses
        }
    }
    
    func setValuesInSubClasses() {
       //subclass will implement
    }
}

class SubCell: BaseCustomCell {
     override func setValuesInSubClasses() {
       //set value from cellViewModel
      }
 }

然后你的 viewModel.getCellModelAtIndexPath 应该有一个 return 类型的 CellViewModel,所以它可以 return 任何符合协议的类型。

因此,您只需声明具体的单元格视图模型,例如 class FirstCellViewModel: CellViewModel { ... } 等,您可以 return 来自 getCellModelAtIndexPath