RxSwift DataSource configureCell не может назначить функцию

Я пытаюсь использовать RxSwift/RxDataSource с TableView, но я не могу назначить configureCell с существующей функцией. Код ниже:

import UIKit
import RxSwift
import RxCocoa
import RxDataSources

class BaseTableViewController: UIViewController {
    // datasources
    let dataSource = RxTableViewSectionedReloadDataSource<TableSectionModel>()
    let sections: Variable<[TableSectionModel]> = Variable<[TableSectionModel]>([])
    let disposeBag: DisposeBag = DisposeBag()

    // components
    let tableView: UITableView = UITableView()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        setDataSource()
    }

    func setupUI() {
        attachViews()
    }

    func setDataSource() {
        tableView.delegate = nil
        tableView.dataSource = nil
        sections.asObservable()
            .bindTo(tableView.rx.items(dataSource: dataSource))
            .addDisposableTo(disposeBag)
        dataSource.configureCell = cell
        sectionHeader()
    }

    func cell(ds: TableViewSectionedDataSource<TableSectionModel>, tableView: UITableView, indexPath: IndexPath, item: TableSectionModel.Item) -> UITableViewCell! {
        return UITableViewCell()
    }

    func sectionHeader() {

    }
}

Xcode выдает следующую ошибку:

/Users/.../BaseTableViewController.swift:39:36: Невозможно назначить значение типа '(TableViewSectionedDataSource, UITableView, IndexPath, TableSectionModel.Item) -> UITableViewCell!' набрать '(TableViewSectionedDataSource, UITableView, IndexPath, TableSectionModel.Item) -> UITableViewCell!'

ошибка выдается в строке

dataSource.configureCell = cell

Есть ли у вас какие-либо идеи?

Спасибо

1 ответ

Вам просто нужно удалить ! от типа возврата UITableViewCell! вашего клеточного метода.

func cell(ds: TableViewSectionedDataSource<TableSectionModel>, tableView: UITableView, indexPath: IndexPath, item: TableSectionModel.Item) -> UITableViewCell {
    return UITableViewCell()
}

Таким образом, ваша функция стала совместимой по типу с типом, ожидаемым свойством configureCell RxDataSource:

public typealias CellFactory = (TableViewSectionedDataSource<S>, UITableView, IndexPath, I) -> UITableViewCell

Я лично предпочитаю следующий синтаксис для инициализации configureCell:

dataSource.configureCell = { (_, tableView, indexPath, item) in
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    // Your configuration code goes here
    return cell
}
Другие вопросы по тегам