У меня есть протокол с именем TableViewItem
. Этот протокол обеспечивает, что соответствующие объекты реализуют свойство type
, в качестве типа которого используется протокол TableViewCellIdentifiable
. TableViewCellIdentifiable
используется для группировки трех вложенных перечислений, как показано ниже:
internal protocol TableViewCellIdentifiable: Equatable { }
internal enum TableViewCellType {
internal enum PortfolioSelection: String, TableViewCellIdentifiable {
case portfolio = "portfolioTableViewCell"
case enterPortfolioDetails = "enterPortfolioDetailsTableViewCell"
case addPortfolio = "actionTableViewCell"
}
internal enum EditPortfolio: String, TableViewCellIdentifiable {
case editPortfolioName = "editPortfolioNameTableViewCell"
case deletePortfolio = "deletePortfolioTableViewCell"
}
internal enum Portfolio: String, TableViewCellIdentifiable {
case portfolioAsset = "portfolioAssetTableViewCell"
case addAsset = "actionTableViewCell"
}
}
Вот пример того, как это используется:
internal final class EditPortfolioNameTableViewItem: TableViewItem {
// MARK: - Internal Properties
internal let type: TableViewCellIdentifiable = TableViewCellType.EditPortfolio.editPortfolioName
internal let viewModel: TableViewCellModel
// MARK: - Initialization
internal init(viewModel: EditPortfolioNameTableViewCellModel) {
self.viewModel = viewModel
}
}
К сожалению, в строке, где я объявляю свойство type
, я получаю следующую ошибку:
Протокол 'TableViewCellIdentifiable' может использоваться только в качестве общего ограничения, поскольку он имеет требования к Self или связанный тип
Я прочитал другие вопросы / ответы от других, кто сталкивался с этой ошибкой, но я не могу полностью понять, почему эта конкретная реализация проблематична, и каково будет решение. Я знаю, что Equatable
является источником проблемы, однако это крайне важно для функциональности, поскольку перечисления служат двум целям:
- Чтобы обеспечить идентификаторы повторного использования для ячеек табличного представления (необработанные значения).
Чтобы позволить сравнивать типы - т.е.:
self.tableViewItems.contains(where: { $0.type == item.type })
Любые предложения будут высоко оценены, даже если это будет означать альтернативный подход.