Соответствие протокола не подразумевается для элемента коллекции

У меня есть набор протоколов, чтобы иметь возможность отображать элемент в 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
Другие вопросы по тегам