首页 > 解决方案 > RxSwift 子类化最佳实践

问题描述

我有一个在两个流程中使用的视图模型,并且已经到了应该将它真正拆分为一个超类和两个子类的阶段。但是,我对执行某些子类化的最佳方式感到困惑。

在创建视图模型时,我传递了视图中可能发生的所有交互,如下所示:

看法

class SomeViewController: UIViewController {

    @IBOutlet private weak var nextButton: UIButton!

    private var presenter: SomeViewModel!

    override func viewDidLoad() {
        super.viewDidLoad()
        presenter.configure(nextButtonTapped: nextButton.rx.tap.asDriver())
    }

}

然后我可以在我的视图模型中处理这些操作,如下所示:

视图模型

class SomeViewModel {

    private let normalFlow: Bool
    private let diposeBag = DisposeBag()

    init(normalFlow: Bool) {
        self.normalFlow = normalFlow
    }

    func configure(nextButtonTapped: Driver<Void>) {
        handle(nextButtonTapped: nextButtonTapped)
        // call to any other input handlers here...    
    }

    func handle(nextButtonTapped: Driver<Void>) {
        nextButtonTapped.drive(onNext: { [unowned self] in
            guard self.safetyCheckOnePasses(), safetyCheckTwoPasses() else {
                return
            }
            if normalFlow {
                // do some set of actions
            } else {
                // do another set of actions
            }
        }).disposed(by: disposeBag)
    }

    func safetyCheckOnePasses() -> Bool {
        // perform some sanity check...
        return true
    }

    func safetyCheckTwoPasses() -> Bool {
        // perform another sanity check...
        return true
    }

}

我对覆盖的最佳方法感到困惑,handle(nextButtonTapped: Driver<Void>)因为我仍然希望在每个子类的开始时进行这些健全性检查onNext,但我希望之后的主体对于不同的子类是不同的。在不复制代码的情况下,最好的方法是什么?

标签: iosswiftrx-swift

解决方案


Rx 是功能范式的一部分,因此,子类化是不合适的。

将您的safetyCheckOnePasses()safetyCheckTwoPasses()函数移出类(或至少使它们成为静态的)。这样它们就可以在不需要实例的情况下被重用。


推荐阅读