gpt4 book ai didi

mvvm - 快速继承任务

转载 作者:行者123 更新时间:2023-12-03 10:19:24 25 4
gpt4 key购买 nike

几天前,我在 objc 之后转向了 swift 编码。当我用 MVVM 模式编写适配器时,我对下一种情况感到困惑,这可以在 objc 中完成而没有任何问题。

所以在 Objc 中:我们有 IDTableViewController 和 presenter (viewModel) 属性

@interface IDTableViewController : UITableViewController
@property (nonatomic, strong) id<IDCollectionPresenterProtocol> presenter;
@end

而我们在继承IDTableViewController的时候,在extension中重写了presenter的class(当然符合上面提到的protocol)
UsersViewController.h 
@interface UsersViewController : IDTableViewController

UsersViewController.m
@interface UsersViewController ()
@property (nonatomic, strong) UsersPresenter *presenter;
@end

@implementation UsersViewController
@dynamic presenter;

一切都很好......但是我不能很快做同样的事情。我无法覆盖 UsersViewController 中的属性类
class IDTableViewController: UITableViewController {

var viewModel : IDCollectionPresenterProtocol?
}
class UsersViewController: IDTableViewController {

var viewModel : UsersPresenter?
}

我可以这样做吗?如果不合法,我该如何实现?

最佳答案

有几种方法:

  • 您可以使用计算属性覆盖存储属性,该计算属性是您自己的私有(private)存储属性的前端,例如:
    class UsersViewController: IDTableViewController {
    private var usersViewModel: UsersPresenter?
    override var viewModel: IDCollectionPresenterProtocol? {
    get { return usersViewModel }
    set { usersViewModel = newValue as! UsersPresenter }
    }
    }
  • 您无法覆盖 viewModel完全没有,只需执行usersViewModel如果您需要 UsersPresenter,则作为计算属性本身UsersViewController 内 View 模型的接口(interface):
    class UsersViewController: IDTableViewController {
    private var usersViewModel: UsersPresenter? {
    get { return viewModel as? UsersPresenter }
    set { viewModel = newValue }
    }
    }

  • 其他更自然的 Swifty 处理方法(例如,泛型或协议(protocol)扩展中的 UITableViewDataSource 方法的默认实现)不能很好地与 Objective-C 配合使用,因此在使用它们时会遇到问题查看 Controller 或作为 UITableViewDataSource .

    关于mvvm - 快速继承任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018618/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com