0

我有一组协议能够在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.ServiceTableRepresentableRow但是,这不会发生:

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() ?? ""
  }
}

为什么我会收到此错误?

更新: 协议组合也不起作用: 在此处输入图像描述

4

3 回答 3

1

要解决此问题,请将元素类型检查更改为仅协议:

改变:

where Element == ServicesSummary.Service

至:

where Element == TableRepresentableRow

整个扩展:

extension Array: TableRepresentableSection where Element == TableRepresentableRow {
    var title: String {
        return first?.businessType.rawValue.uppercased() ?? ""
    }
}
于 2018-06-20T13:40:47.120 回答
0

我完成了以下代码,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 ""
  }
}
于 2018-06-20T15:28:33.843 回答
0

Array扩展只包含返回类型对象的下Array标函数Element——在这种情况下ServicesSummary.Service。所以编译器需要你实现的下标函数是TableRepresentableSection协议中的那个,因为这个有不同的返回类型:TableRepresentableRow. 您有 2 个选项:

  • 将类型更改ElementTableRepresentableRow
  • 删除下标函数TableRepresentableSection
于 2018-06-20T13:44:17.903 回答