如何在 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
我希望 属性“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