如何在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? YourType
将cellViewModel
转换为具体类型以上是关于如何在swift中使基类属性通用,以便可以与多种模型类型一起使用?的主要内容,如果未能解决你的问题,请参考以下文章