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

Posted

技术标签:

【中文标题】如何在swift中使基类属性通用,以便可以与多种模型类型一起使用?【英文标题】:How to make Base class property generic in swift so can use with multiple model type? 【发布时间】:2020-09-22 08:20:23 【问题描述】:

我希望属性“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。你能帮忙解决一下吗?

【问题讨论】:

【参考方案1】:

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

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

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

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应该有一个CellViewModel的返回类型,所以它可以返回任何符合协议的类型。

因此您只需声明您的具体单元格视图模型,如class FirstCellViewModel: CellViewModel ... 等,您可以从getCellModelAtIndexPath 返回它们

【讨论】:

我没有使用故事板。对我来说看起来不错,请您添加更多解释。 @AvijitNagare 不确定在不涉及更具体的问题的情况下我还能解释什么。正如我所说,只需将cellViewModel 的类型声明为协议,使您的viewModel.getCellModelAtIndexPath 具有协议的返回类型,然后在getCellModelAtIndexPath 的实现中,您可以根据具体的视图模型类型返回无论你有什么标准。 无法在子类中设置 CellViewModel 协议类型的值,因为我声明了没有属性的 CellViewModel(Base Protocol)。但是我的子类具有属性并且需要更新 cellViewModel(其属性在基本 cellViewModel 中不匹配)。对此的任何解决方案。 @AvijitNagare 只需使用cellViewModel as? YourTypecellViewModel 转换为具体类型

以上是关于如何在swift中使基类属性通用,以便可以与多种模型类型一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

c ++使基类在子类中使用覆盖的方法

如何在 Swift 中使按钮具有圆形边框?

如何在 Xcode 中使元素具有百分比宽度

使用 C++ 基类构造函数?

在 swift 中使 URL 链接属性和可点击以及可编辑的 Textview

如何在 Swift iOS 中使 web 视图不可点击