Как создать протокол шаблона для делегата UITableViewCell докладчика IN VIPER

Я использую архитектуру VIPER со Swift.
Я хочу использовать протокол для докладчика, чтобы получить делегата UITableView, потому что я не хочу повторять объявления этих методов для всех докладчиков.

Итак, я создал протокол

protocol TableViewPresenterProtocol: class {
    associatedtype Data
    func numberOfSections()-> Int
    func haeaderTitle(secton: Int)-> String?
    func numberOfRows(section: Int)-> Int
    func itemForCell(at indexPath: IndexPath)-> Data
    func didSelect(at indexPath: IndexPath)
}

//for make optional
extension TableViewPresenterProtocol {
    func numberOfSections()-> Int {
        return 1
    }
    
    func haeaderTitle(secton: Int)-> String? {
        return nil
    }
}

class PaymentViewController {
    var presenter: (PaymentPresenterProtocol & TableViewPresenterProtocol)?
}

но XCode показывает ошибку

Протокол «TableViewPresenterProtocol» может использоваться только в качестве общего ограничения, поскольку он имеет требования к типу Self или связанному типу.

Где в исходном коде это исправить?


person Mirzohid Akbarov    schedule 04.03.2021    source источник


Ответы (1)


В вашем PaymentViewController в настоящее время компилятор не имеет возможности определить, на что ссылается ваш associatedtype Data. Это может быть String, это может быть Int или что-то еще. Свифту это не нравится. Это не может работать с этим, потому что неясно, к чему на самом деле относится associatedtype.

Чтобы решить эту проблему, мы можем использовать TableViewPresenterProtocol в качестве общего ограничения, чтобы сообщить Swift, на какой тип мы ссылаемся. В вашем случае это выглядит так:

class PaymentViewController<A: TableViewPresenterProtocol> {
    var presenter: (A)?
}

И допустим, вы создаете класс, соответствующий TableViewPresenterProtocol:

class SomeOtherController: TableViewPresenterProtocol {
     typealias Data = String
     // Other conformance stuff here
}

И теперь вы можете сказать:

PaymentViewController<SomeOtherController>()

И Свифту будет ясно, что associatedtype Data ведущего - это String.

person πter    schedule 04.03.2021