Как я могу правильно использовать relatedType в моем протоколе - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь придумать MVVM, ориентированный на протокол, для своих ячеек табличного просмотра.У меня их много.

my viewModel

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

my view

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

my class соответствие

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
    }
}

Результаты текущих настроекв следующей ошибке:

Тип 'PlainTableViewCell' не соответствует протоколу 'PlainTableViewCellType'

Я могу заставить его работать, если я делаю:

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

Но я хочу иметь associatedType, чтобы я мог применять одну и ту же модель во всех моих PlainTableViewCellType функциях

РЕДАКТИРОВАТЬ: Я счастлив выслушать альтернативы, ноСначала я хочу узнать , почему это не работает.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы должны создать 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
    }
}
0 голосов
/ 10 октября 2018

В протоколе вам нужно удалить PlainTableViewCellModelType :

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

, а в PlainTableViewCell вам нужно добавить что-то вроде этого:

typealias viewModel = PlainTableViewCellModelType
...