RxSwift постоянно предупреждал меня о том, что TableView.rx.items(источник данных) не соответствует типу RxTableViewDataSourceType при привязке данных

#ios #swift #uitableview #uikit #rx-swift

Вопрос:

Я пытаюсь реализовать TableView с помощью RxTableViewSectionedAnimatedDataSource, я правильно настроил все подклассы, когда я пытаюсь привязать источник данных к моему TableView, компилятор постоянно предупреждает меня

Метод экземпляра «элементы(источник данных:)» требует, чтобы «TableViewSectionedDataSource» соответствовал «RxTableViewDataSourceType»

введите описание изображения здесь

Вот код

 let tableView = UITableView()  let dataSource = RxTableViewSectionedAnimatedDataSourcelt;CustomSectionDataTypegt;(configureCell: { dataSource, tableView, indexPath, item in    return UITableViewCell()  })    dataSource.titleForHeaderInSection = { (ds, section) in  let sectionModel = ds.sectionModels[section]  return sectionModel.header  }    let sectionDatas = [CustomSectionDataType(ID: "1", header: "test", items: ["WTF!"])]    let items = BehaviorRelay(value: [sectionDatas])      items  .bind(to: tableView.rx.items(dataSource: dataSource))  .disposed(by: self.disposeBag)   

Пользовательский Класс Раздела

 struct CustomSectionDataType {  var ID: String  var header: String  var items: [Item]   }   extension CustomSectionDataType: AnimatableSectionModelType {   typealias Item = String  typealias Identity = String    var identity: String {  return ID  }    init(original: CustomSectionDataType, items: [Item]) {  self = original  self.items = items  }   }  

Ответ №1:

У вас слишком глубоко вложенный массив для вашего items типа.

Тип определяется так BehaviorRelaylt;[[CustomSectionDataType]]gt; , как это должно быть BehaviorRelaylt;[CustomSectionDataType]gt; .

Кроме того, рассмотрите возможность использования typealias вместо создания собственного пользовательского типа:

 typealias CustomSectionDataType = AnimatableSectionModellt;String, Stringgt;  

или если у вас есть два одинаковых заголовка, но с разными идентификаторами, то:

 struct CustomModel: IdentifiableType {  var identity: String  var header: String }  typealias CustomSectionDataType = AnimatableSectionModellt;CustomModel, Stringgt;  

Это немного облегчает жизнь.