Не удалось определить общий параметр ‘Self’ RxDataSources «

#ios #swift #rx-swift #rxdatasources

#iOS #swift #rx-swift #rxdatasources

Вопрос:

Я знаю, что по этому поводу есть много вопросов, я просмотрел их все, но это не решает мою проблему. Я также прокомментировал один из них, но вопрос, похоже, больше не активен, поэтому я не ожидаю ответа там.

Я пытаюсь реализовать RxDataSources. Смотрите мой код ниже:

 struct ActiveOrdersSection: Equatable {
    static func == (lhs: ActiveOrdersSection, rhs: ActiveOrdersSection) -> Bool {
        return true
    }

    var header: String
    var orders: [Order]
}

extension ActiveOrdersSection: SectionModelType {
    typealias Item = Order

    var items: [Item] {
        set {
            orders = items
        }
        get {
            return orders
        }
    }

    init(original: ActiveOrdersSection, items: [Order]) {
        self = original
        self.items = items
    }
}
  

И ViewController:

 class MainViewController: UITableViewDelegate, UITableViewDataSource {

    var db: DisposeBag?
    var dataSource: RxTableViewSectionedReloadDataSource<ActiveOrdersSection>?
    private func setupOrderRx(_ shopId: Int64) {
        let dataSource = RxTableViewSectionedReloadDataSource<ActiveOrdersSection>(
            configureCell: { ds, tv, ip, item in
                let cell = tv.dequeueReusableCell(withIdentifier: "Cell", for: ip) as! UITableViewCell
                cell.textLabel?.text = "Item (item.id)"
                return cell
            },

            titleForHeaderInSection: { ds, ip in
                return ds.sectionModels[ip].header
            }
        )

        self.dataSource = dataSource
        db = DisposeBag()
        let ors = OrderRxService.listAsShop(shopId, status: .active)
            .map { Observable.just($0.items) } // Convert from Observable<CollectionResponse<Order>> to Observable<Order>
            .observeOn(MainScheduler.instance)
            .bind(to: self.rxTableView.rx.items(dataSource: dataSource))
    }

}
  

Я Generic parameter 'Self' could not be inferred включаюсь .bind(to: self.rxTableView.rx.items(dataSource: dataSource)) . Я просмотрел примеры RxDataSources, и, похоже, сейчас он такой же, но, похоже, я не могу исправить эту ошибку.

Есть идеи?

Ответ №1:

Поток Rx, который вы привязываете к своему, RxTableViewSectionedReloadDataSource должен быть типа Observable<[ActiveOrdersSection]> . Я не знаю точно, какие у вас типы в этом примере, потому что предоставленного вами кода недостаточно, но я думаю, что при использовании .map { Observable.just($0.items) } результирующий поток будет иметь тип Observable<Observable<[Order]>> . Попробуйте изменить его на: .map { [ActiveOrdersSection(header: "Your Header", orders: 0.items)] }

Комментарии:

1. Спасибо! Похоже, я не совсем понял концепцию RxDataSources. Это решило мою проблему.