gpt4 book ai didi

ios - 如何在我的协议(protocol)中正确使用 associatedType

转载 作者:行者123 更新时间:2023-11-28 05:51:40 26 4
gpt4 key购买 nike

我正在尝试为我的 tableviewcells 设计一个面向协议(protocol)的 MVVM。我有很多。

我的 viewModel

protocol PlainTableViewCellModelType {
var backgroundColor : UIColor {get}
var textColor: UIColor {get}
var titleFont : UIFont {get }
var accessoryType : UITableViewCellAccessoryType {get}
var textLabelNumberOfLines: Int {get}
}

我的 View

protocol PlainTableViewCellType{
associatedtype viewModel : PlainTableViewCellModelType
func setupUI(forViewModel viewModel: viewModel)
}

我的一致性

class PlainTableViewCell : CCTableViewCell, PlainTableViewCellType{

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
fatalError()
}

func setupUI(forViewModel viewModel: PlainTableViewCellModelType){
contentView.backgroundColor = viewModel.backgroundColor
textLabel?.textColor = viewModel.textColor
textLabel?.font = viewModel.titleFont
accessoryType = viewModel.accessoryType
textLabel?.numberOfLines = viewModel.textLabelNumberOfLines
}
}

当前设置导致以下错误:

Type 'PlainTableViewCell' does not conform to protocol 'PlainTableViewCellType'

如果我这样做,我可以让它工作:

protocol PlainTableViewCellType{
func setupUI(forViewModel viewModel: PlainTableViewCellModelType)
}

但我想要一个associatedType,这样我就可以在我所有的PlainTableViewCellType 函数中执行相同的模型

编辑:我很乐意听取替代方案,但首先我想知道为什么这行不通。

最佳答案

您必须创建 PlainTableViewCellModelType 实现并在单元实现中声明 typealias。在 setupUI(forViewModel:) 中将其用作参数类型,因为编译器无法推断关联类型。

protocol PlainTableViewCellModelType {
var backgroundColor : UIColor { get }
var textColor: UIColor { get }
var titleFont : UIFont { get }
var accessoryType : Int { get}
var textLabelNumberOfLines: Int { get }
}

protocol PlainTableViewCellType{
associatedtype viewModel : PlainTableViewCellModelType
func setupUI(forViewModel viewModel: viewModel)
}

struct PlainTableViewCellModel: PlainTableViewCellModelType {
var backgroundColor : UIColor
var textColor: UIColor
var titleFont : UIFont
var accessoryType : Int
var textLabelNumberOfLines: Int
}


class PlainTableViewCell : UITableViewCell, PlainTableViewCellType {
typealias viewModel = PlainTableViewCellModel

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
fatalError()
}

func setupUI(forViewModel viewModel: PlainTableViewCellModel) {
contentView.backgroundColor = viewModel.backgroundColor
textLabel?.textColor = viewModel.textColor
textLabel?.font = viewModel.titleFont
textLabel?.numberOfLines = viewModel.textLabelNumberOfLines
}
}

关于ios - 如何在我的协议(protocol)中正确使用 associatedType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52729852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com