Соответствие протокола не подразумевается для элемента коллекции
У меня есть набор протоколов, чтобы иметь возможность отображать элемент в UITableView:
protocol TableRepresentableRow {
var title: String { get }
var subtitle: String { get }
}
extension TableRepresentableRow {
var title: String {return ""}
var subtitle: String {return ""}
}
protocol TableRepresentableSection {
var title: String { get }
var count: Int { get }
subscript(index: Int) -> TableRepresentableRow {get}
}
extension TableRepresentableSection {
var title: String {
return ""
}
}
Отдельный элемент соответствует протоколу TableRepresentableRow:
extension ServicesSummary.Service: TableRepresentableRow {
var title: String {
return serviceNumber
}
var subtitle: String {
return serviceUserName
}
}
Я ожидаю, что соответствие протокола также будет определено в TableRepresentableSection, поскольку ServicesSummary.Service является TableRepresentableRow, однако этого не происходит:
extension Array: TableRepresentableSection where Element == ServicesSummary.Service {
// Error: the compiler requires me to add subscript too, while it should be inferred
subscript(index: Int) -> TableRepresentableRow {
<#code#>
}
var title: String {
return first?.businessType.rawValue.uppercased() ?? ""
}
}
Почему я получаю эту ошибку?
3 ответа
Чтобы устранить проблему, измените проверку типа элемента только на протокол:
Изменить:
where Element == ServicesSummary.Service
чтобы:
where Element == TableRepresentableRow
Целое расширение:
extension Array: TableRepresentableSection where Element == TableRepresentableRow {
var title: String {
return first?.businessType.rawValue.uppercased() ?? ""
}
}
Я закончил со следующим кодом, удалив subscript
из протокола полностью:
protocol TableRepresentableRow {
var title: String { get }
var subtitle: String { get }
}
extension TableRepresentableRow {
var title: String {return ""}
var subtitle: String {return ""}
}
protocol TableRepresentableSection {
var title: String { get }
var items: [TableRepresentableRow] { get }
}
extension TableRepresentableSection {
var title: String {
return ""
}
}
Array
расширение содержит только Array
индексная функция, которая возвращает объект типа Element
- в этом случае ServicesSummary.Service
, Таким образом, функция индекса, которую требует от вас компилятор, является той из TableRepresentableSection
протокол, так как этот имеет другой тип возврата: TableRepresentableRow
, У вас есть 2 варианта:
- изменить тип
Element
вTableRepresentableRow
- удалить индексную функцию из
TableRepresentableSection